签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
最近因为用到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
PZDIn3Scale : STRUCT
HIGH : REAL := 100.0;
PZDIn4Scale : STRUCT
PZDIn5Scale : STRUCT
PZDIn6Scale : STRUCT
On : BOOL := False;
InvSp : BOOL := False;
END_VAR
VAR_IN_OUT
// I/O Parameters
VAR_OUTPUT
PZDOut1 : WORD := W#16#00;
PZDOut2 : WORD := W#16#00;
SpeedLi : REAL := 0.0;
SpeedScale : STRUCT
Current_Value : REAL :=0.0; //PZD3的值
CurrentScale : 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 ; // 反向运行
VAR
FbDriveState : WORD;
FbDriveIn AT FbDriveState : ARRAY[0..15] OF BOOL;
BEGIN
IF On THEN
PZDOut1 := W#16#047F;
IF InvSp THEN
PZDOut1 := W#16#0C7F;
END_IF;
ELSE PZDOut1 := W#16#047E;
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;
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:
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;
20:
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;
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;
IF WORD_TO_INT(PZDIn5)>0 THEN
Warn_Code := WORD_TO_INT(PZDIn5);
ELSE Warn_Code := 0;
IF WORD_TO_INT(PZDIn6)>0 THEN
Fault_Code := WORD_TO_INT(PZDIn6);
ELSE Fault_Code := 0 ;
END_CASE;
END_FUNCTION_BLOCK
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1436299&b_id=4&s_id=0&num=19
对输入端口的注释:
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.如果为转速,根据需要设置
SP_Li : REAL := 0.0 ; //给定值
SP_LiScale : STRUCT //给定值量程范围
PZDIn3Scale : STRUCT //PZD3量程
PZDIn4Scale : STRUCT //PZD4量程
PZDIn5Scale : STRUCT //PZD5量程,后续开发备用
PZDIn6Scale : STRUCT //PZD6量程,后续开发备用
On : BOOL := False; //启停
InvSp : BOOL := False; //反转
输出注释:
PZDOut1 : WORD := W#16#00; //PZD输出字,直接与输出地址相连,比如PQW256
PZDOut2 : WORD := W#16#00; //PZD输出字,直接与输出地址相连,比如PQW258
SpeedLi : REAL := 0.0; //实际速度输出值
SpeedScale : STRUCT //实际速度输出量程,后续开发备用
HIGH : REAL := 100.0; //PZD3的量程,后续备用
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位取反,反向运行
G120控制字
G120状态字
报文类型及结构
具体组态步骤,可参考官网文档:
https://support.industry.siemens.com/cs/document/109478791/s7-300%E4%B8%8Eg120-cu250s-2-dp%E7%9A%84profibus%E9%80%9A%E8%AE%AF-%E7%AC%AC1%E9%83%A8%E5%88%86%E6%8E%A7%E5%88%B6%E5%8F%98%E9%A2%91%E5%99%A8%E5%90%AF%E5%81%9C%E5%8F%8A%E8%B0%83%E9%80%9F?dti=0&lc=zh-CN
楼主有心了。
贴出来几天了,好像没人待见。
这是利用cfc编程实现的最终结果:
引用7楼详细内容:
哈哈,可能是大家觉得太好了,不知道说什么,我觉得真的挺好,非常的详细。
引用8楼详细内容:
我个人觉得比较实用,一般的新手都可以很快上手。
那天贴出来高兴的,还以为能置精呢。现在看来,都没人看。
我刚刚接触G120,有用 很不错谢谢。。。。。
有了这个功能块,G120通讯分分钟就可实现:
设置宏为4.
更改报文类型P922为4.
PLC调用功能块,下载即可。
引用10楼详细内容:
谢谢,楼主辛苦。能理解楼主的心情,毕竟是自己的劳动成果,都希望能得到认可。可能是大家没有和你一样的实践背景,所以需要时间去消化一下,比如像我这种”肠胃“不太好的人,一时半会儿还真不能理解透彻,还得先去看看G120通讯部分的知识。至于质量怎么样,由于我水平有限,不敢妄议。但是楼主这种再创新精神还是一定要点赞的。
PS.提个建议,像这样的代码”
“中,整数到实数的转换指令括号内的参数表达式,如果能用一个变量名代替的话,易读性是否会好一些?或者干脆把计算工程量转换值的公式部分直接做成一个功能FC,会不会更简洁一些?
一家之言,仅供参考。
引用12楼详细内容:
唐大侠批评的比较对,一直考虑的是怎么用好这个功能块。但是,如果把工程量转换这块改成FC块之后,对新手调用来说,觉得就有点难了。因为,以上有4个工程量转换。不过,个人可以根据喜好,自由更改。因为原始程序就在那里。
经测试,MM4变频器支持标准报文1,有兴趣的,可以研究一下。
,好有心哟
楼主真不错
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录