回复:变频器控制 (第二版)

tangying

  • 帖子

    82
  • 精华

    1
  • 被关注

    19

论坛等级:侠士

注册时间:2010-10-29

普通 普通 如何晋级?

发布于 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


评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10844条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。