恭喜,你发布的帖子
发布于 2018-01-13 10:49:26
22楼
我也来贴一个1200和1500通用的G120变频器控制功能块吧
首先,功能块长这样
下面是功能块源代码
FUNCTION_BLOCK "G120_Control_Telegram 352"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
HW_Address : HW_ANY; // 硬件地址
Forward : Bool := FALSE; // 正转
Reverse : Bool := FALSE; // 反转
OFF2 : Bool := TRUE; // 惯性停车
OFF3 : Bool := TRUE; // 快速停车
Acknowledge : Bool := FALSE; // 错误确认
Setpoint_Speed : Real := 0.0; // 设定速度
Reference_Speed : Real := 50.0; // 参考速度
END_VAR
VAR_OUTPUT
Actual_Speed : Real := 0.0; // 实际速度
Fault : Bool := FALSE; // 故障
Warning : Bool := FALSE; // 警告
Offline : Bool := FALSE; // 通讯掉线
END_VAR
VAR
Send : Struct // 发送数据区
Reserve_1 : Bool := FALSE; // 预留
Reserve_2 : Bool := FALSE; // 预留
Master_Control_PLC : Bool := TRUE; // p854[0]:通过PLC控制/不通过PLC控制
Direction : Bool := FALSE; // p1113[0]:设定值取反
Reserve_3 : Bool := FALSE; // 预留
MOP_Up : Bool := FALSE; // p1035[0]:电动电位器设定值增加
MOP_Down : Bool := FALSE; // p1036[0]:电动电位器设定值减小
Reserve_4 : Bool := FALSE; // 预留
OFF1 : Bool := FALSE; // p840[0]:ON/OFF(OFF1)
OFF2 : Bool := TRUE; // p844[0]:无缓慢停转/缓慢停转(OFF2)信号源 1
OFF3 : Bool := TRUE; // p848[0]:无快速停止/快速停止(OFF3)信号源 1
Enable : Bool := TRUE; // p852[0]:使能运行/禁止运行
Ramp_Fuction_Enable : Bool := TRUE; // p1140[0]:使能斜坡函数发生器/禁止斜坡函数发生器
Continue_Ramp : Bool := TRUE; // p1141[0]:继续斜坡函数发生器/冻结斜坡函数发生器
Setponit_Enable : Bool := TRUE; // p1142[0]:使能设定值/禁止设定值
Acknowledge : Bool := FALSE; // p2103[0]:应答故障
Speed_Setpoint : Int; // p1070[0]:主设定值
User_Define_1 : Int; // [用户自定义]
User_Define_2 : Int; // [用户自定义]
User_Define_3 : Int; // [用户自定义]
User_Define_4 : Int; // [用户自定义]
END_STRUCT;
Recevie : Struct // 接收数据区
Speed_Reached : Bool := FALSE; // 设定/实际转速偏差[0=是,1=否]
Control_Requested : Bool := FALSE; // 控制请求[0=否,1=是]
Overspeed : Bool := TRUE; // 达到最大转速[0=否,1=是]
Current_Limit : Bool := FALSE; // 达到I,M,P极限[0=是,1=否]
Holding_Brake : Bool := FALSE; // 电机抱闸打开[0=否,1=是]
Motor_Overload : Bool := FALSE; // 电机超温报警[0=是,1=否]
Direction : Bool := FALSE; // 电机正向旋转[0=否,1=是]
Inverter_Overload : Bool := FALSE; // 变频器过载报警[0=是,1=否]
Ready : Bool := FALSE; // 接通就绪[0=否,1=是]
Ready_to_Run : Bool := TRUE; // 运行就绪[0=否,1=是]
Running : Bool := FALSE; // 运行使能[0=否,1=是]
Fault : Bool := TRUE; // 存在故障[0=否,1=是]
OFF2_Active : Bool := TRUE; // 缓慢停转当前有效[0=是,1=否]
OFF3_Active : Bool := TRUE; // 快速停止当前有效[0=是,1=否]
Inhibit_Active : Bool := TRUE; // 接通禁止当前有效[0=否,1=是]
Warning : Bool := FALSE; // 存在报警[0=否,1=是]
Actual_Speed : Int := 0; // r63[1]:转速实际值(经过p0045滤波)
Actual_Current : Int := 0; // r68[1]:电流实际值的绝对值(经过p0045滤波)
Actual_Torque : Int := 0; // r80[1]:转矩实际值(经过p0045滤波)
Warning_Code : Word := 0; // r2132:当前报警代码
Fault_Code : Word := 0; // r2131:当前报警代码
Actual_Output_Voltage : Int := 0; // r25 CO: 已滤波的输出电压
Actual_DC_Link_Voltage : Int := 0; // r26 CO: 经过滤波的直流母线电压
Actual_Active_Power : Int := 0; // r32 CO: 已滤波的有功功率实际值
Motor_Temperature : Int := 0; // r35 CO: 电机温度
Analog_Input_1_Value : Int := 0; // r755[0] CO: CU 模拟输入当前值 %, AI0 (Kl 3/4)
Analog_Input_2_Value : Int := 0; // r755[1] CO: CU 模拟输入当前值 %, AI1 (Kl 10/11)
END_STRUCT;
END_VAR
VAR RETAIN
Record : Struct // 记录数据区
Warning_Enable { S7_SetPoint := 'True'} : Bool := TRUE; // 警告输出启用
Warning_Code : Word := 0; // r2132:当前报警代码记录值
Fault_Code : Word := 0; // r2131:当前故障代码记录值
END_STRUCT;
END_VAR
VAR
GETIO_Instance {OriginalPartName := 'GETIO'; LibVersion := '1.1'} : GETIO; // 读取过程映像
SETIO_Instance {OriginalPartName := 'SETIO'; LibVersion := '1.2'} : SETIO; // 传送过程映像
END_VAR
VAR RETAIN
Current_Parameters : Struct // 电流参数
Actual_Current : Real; // 电流当前值
Reference_Current { S7_SetPoint := 'True'} : Real := 100.0; // 电流参考值
END_STRUCT;
Torque_Parameters : Struct // 扭矩参数
Actual_Torque : Real; // 扭矩当前值
Reference_Torque { S7_SetPoint := 'True'} : Real := 100.0; // 扭矩参考值
END_STRUCT;
END_VAR
VAR
Diagnostic_Status : Struct // 通讯状态
Communicate_Fault : Bool; // 通讯故障
Drive_Deactive : Bool; // 禁用
Error : Bool; // 调用函数故障
Return_Value : Int; // 调用函数故障字
END_STRUCT;
END_VAR
VAR_TEMP
Drive_Diagnostic : Int; // 驱动器诊断
CNT_DIAG : UInt;
Diagnostic_Information {OriginalPartName := 'DIS'; LibVersion := '1.0'} : DIS; // 驱动器诊断信息
END_VAR
BEGIN
(* 读取过程映像 *)
#GETIO_Instance(ID := #HW_Address,
INPUTS := #Recevie);
(* 初始化 *)
#Send.Master_Control_PLC := TRUE;
#Send.Enable := TRUE;
#Send.Ramp_Fuction_Enable := TRUE;
#Send.Continue_Ramp := TRUE;
#Send.Setponit_Enable := TRUE;
(* 启动停止 *)
#Send.OFF1 := ((#Forward AND NOT #Reverse) OR (#Reverse OR #Forward)) AND #Recevie.Ready AND NOT #Recevie.Fault AND NOT #Diagnostic_Status.Communicate_Fault;
(* 方向选择 *)
#Send.Direction := #Reverse AND NOT #Forward;
(* 缓慢停止 *)
#Send.OFF2 := #OFF2;
(* 快速停止 *)
#Send.OFF3 := #OFF3;
(* 驱动器故障 *)
IF #Recevie.Fault AND #Recevie.Fault_Code <> 16#0 THEN
#Record.Fault_Code := #Recevie.Fault_Code;
END_IF;
#Fault := #Recevie.Fault;
(* 驱动器警告 *)
IF #Recevie.Warning AND #Recevie.Warning_Code <> 16#0 THEN
#Record.Warning_Code := #Recevie.Warning_Code;
END_IF;
#Warning := #Recevie.Warning AND #Record.Warning_Enable;
(* 故障确认 *)
#Send.Acknowledge := #Acknowledge;
(* 实际速度 *)
#Actual_Speed := INT_TO_REAL(#Recevie.Actual_Speed) * #Reference_Speed / 16384.0;
(* 实际电流 *)
#Current_Parameters.Actual_Current := INT_TO_REAL(#Recevie.Actual_Current) * #Current_Parameters.Reference_Current / 16384.0;
(* 实际扭矩 *)
#Torque_Parameters.Actual_Torque := INT_TO_REAL(#Recevie.Actual_Torque) * #Torque_Parameters.Reference_Torque / 16384.0;
(* 设定速度 *)
IF #Reference_Speed <> 0.0 THEN
#Send.Speed_Setpoint := LIMIT(MN := -32768, IN := REAL_TO_INT(#Setpoint_Speed * 16384.0 / #Reference_Speed), MX := 32767);
ELSE
#Send.Speed_Setpoint := 0;
END_IF;
(* 传送过程映像 *)
#SETIO_Instance(ID := #HW_Address,
OUTPUTS := #Send);
(* 传送过程映像 *)
#Drive_Diagnostic := GET_DIAG(MODE := 1, LADDR := #HW_Address, CNT_DIAG => #CNT_DIAG, DIAG := #Diagnostic_Information);
(* 驱动器诊断 *)
IF #Drive_Diagnostic >= 0 THEN
#Diagnostic_Status.Error := FALSE;
#Diagnostic_Status.Return_Value := 0;
IF #Diagnostic_Information.OwnState = 16#1 THEN
#Diagnostic_Status.Drive_Deactive := TRUE;
#Diagnostic_Status.Communicate_Fault := FALSE;
ELSE
#Diagnostic_Status.Drive_Deactive := FALSE;
IF #Diagnostic_Information.OwnState = 16#5 THEN
#Diagnostic_Status.Communicate_Fault := TRUE;
ELSE
#Diagnostic_Status.Communicate_Fault := FALSE;
END_IF;
END_IF;
ELSE
#Diagnostic_Status.Error := TRUE;
#Diagnostic_Status.Return_Value := #Drive_Diagnostic;
#Diagnostic_Status.Communicate_Fault := FALSE;
#Diagnostic_Status.Drive_Deactive := FALSE;
END_IF;
(* 驱动器通讯掉线 *)
#Offline := #Diagnostic_Status.Communicate_Fault;
END_FUNCTION_BLOCK
请填写推广理由:
分享
只看
楼主