发表于:2014/2/12 15:39:08
#0楼
S7-200的Modbus RTU主/从库使用简单方便。关于Modbus协议介绍和该库的具体使用,在此忽略,只贴出本人在实际运用中遇到的问题:
(1):发生“未为库分配V存储区”错误,右键“程序块”-->库存储区,分配存储区,注意不能与其他存储区重叠。有次我把库存储区起始地址设为VB500,随着程序的编写,用到了VB500之后的地址,导致读写指令不工作,错误代码具体是几,忘记了。查找了好久才发现该问题,期间走了许多弯路,很是郁闷。建议将库存储区尽量往后分配。
(2):MBUS_CTRL(主)和MBUS_INIT(从)的Mode可以切换PPI与Modbus。有次在调试过程中发现不能向PLC下载程序(当时头蒙,居然忘了该细节)。最后才得知该口被Modbus占用了,将CPU的开关拨到STOP即可监控和下载程序。后来我通过一个钮子开关切换Mode位,以此切换modbus与PPI,CPU模式开关一直拨在TEAM档,很方便。(通过Micro/Win启动后,Micro/Win已不能监控程序)
(3):PORT0支持Modbus RTU主站模式和从站模式;PORT1只支持主站模式,不支持从站模式。至于PORT1不支持从站,个人觉得是因为一个CPU如被两个主站控制,那么相当于该CPU在Modbus网络存在多个主站控制,那么“令牌优先权”问题不好解决。如果非要将PORT1实现Modbus从站功能,可参考西门子提供的“Tip041b.mwp”。(见附件)
(4):Modbus主站库使用了中断,在其他程序段中不可禁止中断。
(5):在使用Modbus主站库时,由于同一时刻只能调用一个MBUS_MSG(否则会发生错误代码6,曾经我忽视该错误代码,同时调用2~5条读写指令,上位机读写正常,没有问题。后来为了程序严谨,取缔了该做法。)一般用上一个MBUS_MSG的Done完成位来触发下一条读写指令(相对于通过定时器读写,可以提高通讯效率);对于MBUS_MSG的First位,只需导通一个周期即可完成一次读写,一般用上升沿触发,完成后要复位,方便下次触发。
(6):使用Modbus主站库时,从站延时时间设置过长,或从站掉电、故障都会发生错误代码3,即从站无响应。为了记录错误代码,可以将Error保存至某个链表,以便查看错误记录。具体做法是采用ATT填表指令和FIFO先进先出指令保存最新的n条错误代码(注:表指令操作的数据格式为VW,Error为VB,另外一个字节可以用来保存该错误发生在哪条读写指令)。注意及时保存,当done位从0变为1,error会被再次刷新。保存完之后将error复位为0,在通讯一直发生错误时,该做法可以通过error的变化来记录错误的次数。
(7):在使用Modbus从站库时,首先要明白HoldStart(寄存器区起始地址)与MaxHold(VW的个数),该数据区不能与库存储区重叠!假设HoldStart设为&VB100,用串口调试助手发送读寄存器指令,第一个为VW100,第二个为VW102,依次类推。
(8):在调试Modbus从站时,上位机读取的双整数或浮点数不正确。这是由于西门子采用“高字节低地址、低字节高地址”机制。在上位机中将高低字交换后再转换为浮点数,或直接将PLC中需要读写的DW的高低字交换。
(9):关于通讯状态监测:常用SM0.5累加保存至某个寄存器,在上位机监测该寄存器,如果1S变化一次,则表示通讯正常。
显然,通信时问题不止这些,软硬件必须都要严格要求,比如通信距离远时必须配置终端电阻等等。该贴只为给初次使用该库的新手们提个醒。如有不对和不足的地方,不吝赐教,感激万分。
最后引用西门子的一句话:“记住联网的格言:你糊弄它,它就糊弄你!”
(1):发生“未为库分配V存储区”错误,右键“程序块”-->库存储区,分配存储区,注意不能与其他存储区重叠。有次我把库存储区起始地址设为VB500,随着程序的编写,用到了VB500之后的地址,导致读写指令不工作,错误代码具体是几,忘记了。查找了好久才发现该问题,期间走了许多弯路,很是郁闷。建议将库存储区尽量往后分配。
(2):MBUS_CTRL(主)和MBUS_INIT(从)的Mode可以切换PPI与Modbus。有次在调试过程中发现不能向PLC下载程序(当时头蒙,居然忘了该细节)。最后才得知该口被Modbus占用了,将CPU的开关拨到STOP即可监控和下载程序。后来我通过一个钮子开关切换Mode位,以此切换modbus与PPI,CPU模式开关一直拨在TEAM档,很方便。(通过Micro/Win启动后,Micro/Win已不能监控程序)
(3):PORT0支持Modbus RTU主站模式和从站模式;PORT1只支持主站模式,不支持从站模式。至于PORT1不支持从站,个人觉得是因为一个CPU如被两个主站控制,那么相当于该CPU在Modbus网络存在多个主站控制,那么“令牌优先权”问题不好解决。如果非要将PORT1实现Modbus从站功能,可参考西门子提供的“Tip041b.mwp”。(见附件)
附件:
[本地下载](5):在使用Modbus主站库时,由于同一时刻只能调用一个MBUS_MSG(否则会发生错误代码6,曾经我忽视该错误代码,同时调用2~5条读写指令,上位机读写正常,没有问题。后来为了程序严谨,取缔了该做法。)一般用上一个MBUS_MSG的Done完成位来触发下一条读写指令(相对于通过定时器读写,可以提高通讯效率);对于MBUS_MSG的First位,只需导通一个周期即可完成一次读写,一般用上升沿触发,完成后要复位,方便下次触发。
(6):使用Modbus主站库时,从站延时时间设置过长,或从站掉电、故障都会发生错误代码3,即从站无响应。为了记录错误代码,可以将Error保存至某个链表,以便查看错误记录。具体做法是采用ATT填表指令和FIFO先进先出指令保存最新的n条错误代码(注:表指令操作的数据格式为VW,Error为VB,另外一个字节可以用来保存该错误发生在哪条读写指令)。注意及时保存,当done位从0变为1,error会被再次刷新。保存完之后将error复位为0,在通讯一直发生错误时,该做法可以通过error的变化来记录错误的次数。
(7):在使用Modbus从站库时,首先要明白HoldStart(寄存器区起始地址)与MaxHold(VW的个数),该数据区不能与库存储区重叠!假设HoldStart设为&VB100,用串口调试助手发送读寄存器指令,第一个为VW100,第二个为VW102,依次类推。
(8):在调试Modbus从站时,上位机读取的双整数或浮点数不正确。这是由于西门子采用“高字节低地址、低字节高地址”机制。在上位机中将高低字交换后再转换为浮点数,或直接将PLC中需要读写的DW的高低字交换。
(9):关于通讯状态监测:常用SM0.5累加保存至某个寄存器,在上位机监测该寄存器,如果1S变化一次,则表示通讯正常。
显然,通信时问题不止这些,软硬件必须都要严格要求,比如通信距离远时必须配置终端电阻等等。该贴只为给初次使用该库的新手们提个醒。如有不对和不足的地方,不吝赐教,感激万分。
最后引用西门子的一句话:“记住联网的格言:你糊弄它,它就糊弄你!”
[此贴子已经被作者于2014/2/12 15:41:51编辑过]