电工学习网

 找回密码
 立即注册
查看: 7326|回复: 1
打印 上一主题 下一主题

西门子G120与300/400 DP/PN通讯块

[复制链接]
跳转到指定楼层
楼主
发表于 2017-11-13 10:38:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
   最近因为用到300plc变频器通讯的问题,一般都是使用官网的视频教程中方法来实现。后来,在PCS7项目中,用到了FB_Drive块。因为没有源程序,所以套用FB_Drive的部分输入、输出接口,经过两天的摸索,终于搞出来了。实际使用中,直接调用该块,连接实际通道,设置基准电流量程和基准转矩量程即可。根据FB_Drive块的思路,目前只支持标准报文1和20.后续如果有时间,再研究其它报文的格式。如果有什么不对指出,欢迎各位专家批评指正。

FUNCTION_BLOCK FB2100  //FBDrive

TITLE = 'FBDrive'
//
// Block Comment...
//
VERSION: '1.0'
AUTHOR: Author
NAME: HSC
FAMILY: Drive


VAR_INPUT
   PZDIn1  : WORD :=W#16#00;
   PZDIn2  : WORD :=W#16#00;
   PZDIn3  : WORD :=W#16#00;
   PZDIn4  : WORD :=W#16#00;
   PZDIn5  : WORD :=W#16#00;
   PZDIn6  : WORD :=W#16#00;
   Telegram  : INT  := 20;
   PZDIn2Scale : STRUCT
         HIGH : REAL := 50.0;
         LOW  : REAL := 0.0;
               END_STRUCT;

   SP_Li :  REAL := 0.0 ;
   SP_LiScale : STRUCT
          HIGH : REAL := 50.0;
          LOW  : REAL := 0.0;
              END_STRUCT;
   PZDIn3Scale : STRUCT
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
              END_STRUCT;
   PZDIn4Scale : STRUCT
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
              END_STRUCT;  
   PZDIn5Scale : STRUCT
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
              END_STRUCT;
   PZDIn6Scale : STRUCT
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
             END_STRUCT;        
   On        : BOOL := False;
   InvSp     : BOOL := False;

END_VAR

VAR_IN_OUT
    // I/O Parameters
END_VAR

VAR_OUTPUT
    PZDOut1  : WORD := W#16#00;
    PZDOut2  : WORD := W#16#00;
    SpeedLi  : REAL := 0.0;
    SpeedScale  : STRUCT
          HIGH : REAL := 50.0;
          LOW  : REAL := 0.0;
              END_STRUCT;  
    Current_Value : REAL :=0.0;     //PZD3的值
    CurrentScale  : STRUCT
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
             END_STRUCT;   
    Mist_Glatt : REAL := 0.0 ;     //当前转矩值
    Warn_Code  : INT  := 0 ;       // 报警代码
    Fault_Code : INT  := 0 ;       // 故障代码
    Rdy_On      : BOOL := False ;   // 准备打开
    RdyOp      : BOOL := False ;   // 准备运行
    Warnning   : BOOL := False ;   // 报警
    Fault      : BOOL := False ;   // 故障
    Running    : BOOL := False ;   // 运行
    Inv_Running : BOOL := False ;  // 反向运行
END_VAR

VAR
FbDriveState : WORD;
FbDriveIn  AT  FbDriveState : ARRAY[0..15] OF BOOL;
END_VAR
BEGIN
   IF On THEN
       PZDOut1 := W#16#047F;
      IF   InvSp THEN
          PZDOut1 := W#16#0C7F;
      END_IF;
   ELSE  PZDOut1 := W#16#047E;
   END_IF;

   IF  SP_Li >0.0 THEN
      PZDOut2 := INT_TO_WORD(REAL_TO_INT(SP_Li*16384.0/(SP_LiScale.HIGH-SP_LiScale.LOW)));
   ELSE  PZDOut2 := W#16#00;
   END_IF;

   FbDriveState := PZDIn1 ;

  Rdy_On  := FbDriveIn[8];
  RdyOp   := FbDriveIn[9];
  Running := FbDriveIn[10];
  Fault   := FbDriveIn[11];
  Warnning := FbDriveIn[15];
  Inv_Running := NOT FbDriveIn[6];


   CASE  Telegram  OF
      1:
          IF SP_Li >0.0 THEN
            SpeedLi := (INT_TO_REAL(WORD_TO_INT(PZDIn2))*((SP_LiScale.HIGH-SP_LiScale.LOW)/16384.0))+SP_LiScale.LOW;
            SpeedScale.HIGH := SP_LiScale.HIGH;
            SpeedScale.LOW  := SP_LiScale.LOW;
          ELSE  SpeedLi := 0.0;
          END_IF;
      20:
          IF SP_Li >0.0 THEN
            SpeedLi := (INT_TO_REAL(WORD_TO_INT(PZDIn2))*((SP_LiScale.HIGH-SP_LiScale.LOW)/16384.0))+SP_LiScale.LOW;
            SpeedScale.HIGH := SP_LiScale.HIGH;
            SpeedScale.LOW  := SP_LiScale.LOW;
          ELSE  SpeedLi := 0.0;
          END_IF;

          IF  (INT_TO_REAL(WORD_TO_INT(PZDIn3)))> 0 THEN
             Current_Value := (INT_TO_REAL(WORD_TO_INT(PZDIn3))*((CurrentScale.HIGH-CurrentScale.LOW)/16384.0))+CurrentScale.LOW;
             CurrentScale.HIGH  := PZDIn3Scale.HIGH;
             CurrentScale.LOW   := PZDIn3Scale.LOW;
          ELSE  Current_Value := 0.0;
          END_IF;

          IF  (INT_TO_REAL(WORD_TO_INT(PZDIn4)))> 0 THEN
             Mist_Glatt := (INT_TO_REAL(WORD_TO_INT(PZDIn4))*((PZDIn4Scale.HIGH-PZDIn4Scale.LOW)/16384.0))+PZDIn4Scale.LOW;
          ELSE  Mist_Glatt := 0.0;
          END_IF;
         IF  WORD_TO_INT(PZDIn5)>0 THEN
             Warn_Code  :=  WORD_TO_INT(PZDIn5);
         ELSE   Warn_Code  := 0;
         END_IF;

         IF    WORD_TO_INT(PZDIn6)>0  THEN
             Fault_Code :=  WORD_TO_INT(PZDIn6);
         ELSE   Fault_Code := 0 ;
         END_IF;
   END_CASE;

END_FUNCTION_BLOCK
对输入端口的注释:
VAR_INPUT
   PZDIn1  : WORD :=W#16#00;   //直接与输入地址相连,比如PIW256
   PZDIn2  : WORD :=W#16#00;   //直接与输入地址相连,比如PIW258
   PZDIn3  : WORD :=W#16#00;   //直接与输入地址相连,比如PIW260
   PZDIn4  : WORD :=W#16#00;  //直接与输入地址相连,比如PIW262
   PZDIn5  : WORD :=W#16#00;  //直接与输入地址相连,比如PIW264
   PZDIn6  : WORD :=W#16#00;  //直接与输入地址相连,比如PIW256
   Telegram  : INT  := 20;   //报文类型,M系列变频器,只能报文1,G120可以是1和20.当报文类型为1时,只能读取反馈转速值
   PZDIn2Scale : STRUCT     //PZD2的零点和量程,此处如果为频率,设置为50.如果为转速,根据需要设置
         HIGH : REAL := 50.0;
         LOW  : REAL := 0.0;
               END_STRUCT;

   SP_Li :  REAL := 0.0 ;   //给定值
   SP_LiScale : STRUCT     //给定值量程范围
          HIGH : REAL := 50.0;
          LOW  : REAL := 0.0;
              END_STRUCT;
   PZDIn3Scale : STRUCT     //PZD3量程
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
              END_STRUCT;
   PZDIn4Scale : STRUCT    //PZD4量程
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
              END_STRUCT;  
   PZDIn5Scale : STRUCT   //PZD5量程,后续开发备用
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
              END_STRUCT;
   PZDIn6Scale : STRUCT   //PZD6量程,后续开发备用
          HIGH : REAL := 100.0;
          LOW  : REAL := 0.0;
             END_STRUCT;        
   On        : BOOL := False;   //启停
   InvSp     : BOOL := False;    //反转


END_VAR
输出注释:
VAR_OUTPUT
    PZDOut1  : WORD := W#16#00;  //PZD输出字,直接与输出地址相连,比如PQW256
    PZDOut2  : WORD := W#16#00;  //PZD输出字,直接与输出地址相连,比如PQW258
    SpeedLi  : REAL := 0.0;    //实际速度输出值
    SpeedScale  : STRUCT      //实际速度输出量程,后续开发备用
          HIGH : REAL := 50.0;
          LOW  : REAL := 0.0;
              END_STRUCT;  
    Current_Value : REAL :=0.0;     //PZD3的值
    CurrentScale  : STRUCT
          HIGH : REAL := 100.0;   //PZD3的量程,后续备用
          LOW  : REAL := 0.0;
             END_STRUCT;   
    Mist_Glatt : REAL := 0.0 ;     // PZD4的值,报文20中为当前转矩值
    Warn_Code  : INT  := 0 ;       // PZD5的值,报文20中为报警代码
    Fault_Code : INT  := 0 ;       // PZD6的值,报文20中为故障代码
    Rdy_On      : BOOL := False ;   // 状态字的第0位,准备打开
    RdyOp      : BOOL := False ;   // 状态字的第1位,准备运行
    Warnning   : BOOL := False ;    // 状态字的第7位,报警
    Fault      : BOOL := False ;   // 状态字的第3位,故障
    Running    : BOOL := False ;    // 状态字的第2位,运行
    Inv_Running : BOOL := False ;    // 状态字的第14位取反,反向运行

END_VAR
G120控制字 西门子G120与300/400 DP/PN通讯块
G120状态字 西门子G120与300/400 DP/PN通讯块
报文类型及结构

西门子G120与300/400 DP/PN通讯块
本文转载自:西门子工业技术论坛

回复

使用道具 举报

沙发
发表于 2017-11-13 12:54:01 | 只看该作者
好资料感谢楼主分享,有三菱PLC的资料分享

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-4-20 02:59

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表