签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
关于200smart PLC调用modbus rtu通讯轮询时的问题
今天,下午在“找答案”中看到有一侧关于200smart PLC调用modbus rtu通讯轮询时,无法正常轮询的问题。根据提问者描述:“当与一个从站通讯时,通讯正常。而2个从站(需要轮询时)无法正常通讯(无法实现轮询工作机制)”。
看了提问者的程序,感觉没有什么疑点,因为提问者描述是按官方的例子程序编辑的。记得初次做modbus rtu通讯项目时,我也是按官方的例子程序测试过,没有发现什么问题。
提问者的编程思路基本与官方的基本一致,开始也是先调用特殊标志位SM0.1将所有的触发位清0,然后初始化modbus rtu通讯指令,待初始化完成后,进行MBUS_MSG指令的轮询。具体问题链接:
http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=189072&cid=1076
晚上回家想起下午的那个问题,总感觉在那处出现不妥,于是,再次上网查看该提问。重新按提问者编辑了程序测试,发现没有报警错误error管脚数值0,但确实没有实现轮询工作,监控各标志位没有被正常轮询触发,图示:
打开帮助手册,仔细核对官方例子程序,发现有其中一个程序段与官方的有一些差异。即网络2与网络3的位置有区别,别的程序段均一致。
发现实际V1.3并没有随着初始化指令完成被触发,同时监控其它MBUS_MSG指令的触发位均为0,说明V1.3并没有被真正的有效触发过。
为验证给V1.3是否被V1.0触发,我在程序网络3中再增加了一个加1指令,数据地址VB100,图示:
监控结果仍然是没有被触发加1指令。
打开200smart 的系统手册,看是否能够找到该指令的具体说明。
关于modbus rtu主站初始化指令及MBUS_MSG指令的时间说明,图示:
这个初始化指令的执行时间在0.2mS ~ 0.1mS之间,并不存在plc的扫描周期的关联(程序的每一次扫描周期一定是大于该初始化需要的时间值)。
既然没有与初始化指令有时间上的冲突,尝试着将V1.0(NO)修改为SM0.1(NC)后测试,目的是先初始化完成一个周期后,再执行轮询工作机制,图示:
这个测试,说明当modbus rtu通讯的初始化程序正常后的第2个周期,触发MBUS_MSG指令程序可以轮询,这个与官方的例子程序的工作机制相吻合。
刨根到底想问题,为什么在同一个周期中,初始化完成标志位Done位无法触发下面的V1.3?
当只有这样的情况时,才有可能没有沿的作用,即SM0.0与V1.0在同一个周期内同时被置1,就没有沿跳变。因为库指令被加密了,无法再看到内部的处理程序段。为验证这个可能原因,我在网络4中增加一个验证程序段来验证这个想法,图示:
果不出其然,VB100并没有被激活加1,原因是特殊标志位SM0.0每次刷新的同时,与上升沿在同一个周期内,所以,沿无效。
那么,模糊的问题开始清晰起来了。如果V1.0等同于SM0.0的状态值,则实际上并没有沿跳变的可能条件,也就没有下面的轮询工作机制的环境。
小结:
该轮询机制无法正常工作的更本原因是:
1) 没有严格按官方的例子程序执行编程;
2) 看似正常的程序段,由于在特殊条件下(V1.0相当于SM0.0状态时)不能够正确产生沿的作用;
3) 程序段的结构非常重要,必须认清程序的扫描机制和特殊标志位是作用;
程序虽然严格按自左而右,自上而下的扫描工作机制执行,但如果遇到特殊程序段应用时,确实需要思考可能存在的原因。有时候,我在编辑程序时也会无意间出现一些自己“匪夷所思”的现象,我会很“自觉”的有意把程序网络段置换个位置测试,可能会达到预想不到的效果,这个实际上仍然是对程序工作机制的理解程度问题,所谓“小问题,大智慧”。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1476188&b_id=64&s_id=0&num=11
这个问题并非是匪夷所思的,主要是因为modbus rtu通讯的完成位标记Done位与特殊标志位SM0.0的特性在此处相同。
另外,错误的应用了上升沿。如果取消启动modbus rtu通讯的启动V1.3的上升沿,轮询可以实现。
也可以用其它控制位,替代V1.0来确定轮询也是可以的。
置换网络段位置,实际上就是为了规避plc程序的扫描周期,我在开始的验证程序中应用SM0.1目的也是规避扫描周期对modbus rtu初始化指令完成标志位Done位与特殊标志位SM0.0特性问题,使V1.0在第二个周期有效。
ctrl指令我一直觉得一执行就会Done。都是一个周期内的事。
我测试结果,这个Done(初始化完成)位等同于SM0.0,所以在同一个时刻,也就没有了上升沿的触发条件。
我觉得新手就是要按照官方给的例子套写,不要多一个指令,也不要少一个指令。
当然MSG可以添加或者减少。
你是老司机。
在不完全了解指令和功能前提下,必须严格按说明书、手册上的程序编程!
一个指令或者一个符号都能使程序差之千里。
呵呵,这就是扫描周期同步指令与异步指令的区别,初始化指令是同步指令,而通讯指令是异步指令。
还有,这种触发轮询的编程方式并不合理。
楼主,你好。我是一个新学者,刚接触到plcmodbus通讯问题,一个plc控制三个变频器,你上面提到有官方给你例子,可以给说下在哪吗?我急需一个这样的例子给我启发,万分感谢。谢谢
这个就是200smart的帮助手册呀,下载,
西门子 S7-200 SMART PLUS V2.1 技术参考
https://support.industry.siemens.com/cs/document/76488152
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录