6SL3210-5BE21-5CV0现货西门子代理
6SL3210-5BE21-5CV0现货西门子代理
6SL3210-5BE21-5CV0现货西门子代理
【续】西门子S7-200 PLC modbus通讯控制变频器(二)
(5)Modbus主站指令
Modbus主站指令当中的个块叫做MBUS_CTRL,MBUS_CTRL有哪些内容呢?
我们来看一下引脚定义的说明:Mode写1的时候是选择Modbus,写0的时候是选择PPI;Baud表示波特率;Parity是奇偶校验,0是无校验,1是奇校验,2是偶校验,这与从站的设置相类似;
Timeout表示的是主站等待从站响应的时间(ms);Done位是初始化完成;Error位表示的是故障代码。其中值得一提的是Timeout这个时间,主站等待从站响应的时间指的是什么呢?让我们来看一下主站和从站之间通讯的过程:
主站会发一帧读写请求给从站,在主站的读写请求发出后,从站应当在Timeout指定的时间内返回应答;
如果在此时间内从站没有应答,则主站发第2次读写请求,第2次还不行发第3次读写请求,如果连续3次在此时间内从站没有应答,则主站认定从站无相应,放弃该从站并报错。
下面来看主站的读写命令(MBUS_MSG),看一下引脚说明:First指的是读写请求触发(沿触发),每当First这一端来了一个沿,Modbus指令便会做出一次读或者写请求,RW标示的是这一次的命令是读还是写,0表示读,1表示写;
Addr表示的是从站数据地址(Modbus标准地址格式),0开头、1开头、3开头和4开头的;Count指的是通讯数据的长度,大120个字,单位可能是bit或word;DataPtr指的是参与通讯的本方数据区,如果是读指令标示的是读回来的指令放在本地的哪一块数据区,如果是写命令表示的是把本地的哪一块数据发给对方;Done位和Error位分别是功能完成和故障代码。
其中值得一提的是Count,刚才讲过它的单位可能是bit或word,究竟是bit或word取决于当时所用的Modbus标准的地址码是用的哪一块,如果对于1-128而言这是一个DO的输出,对于1开头的是一个DI的输入点,这个时候Count的单位指的是bit,而对于3开头和4开头的,那么是AI和保存寄存器,它们的单位是word。
需要注意的是当Count的单位是Bit时,一定Count的数值设置为8的整数倍,否则会出错,这是因为一个基本传输的字符是包含8个数据位的,没有办法只传送一个或几个bit。
(6)Modbus主从站轮询
当存在Modbus多主站轮询的时候,在程序当中我们应当如何处理呢?
上图中展示了这种方法。例如个MBUS_MSG指令我们可以利用它的Done位(本例中为M2.1),把它作为第二条MBUS_MSG指令的First前面的激活端,也就是说个MBUS_MSG完成的时候才会去激活下一条MBUS_MSG指令。
那么同样,第二条指令完成时我们把它作为第三条MBUS_MSG指令的激活条件,在后又把第三条指令的完成位还给条网络,这样的话就构成了一个循环的轮询方式。
(7)Modbus FAQ
问1:S7-200是否支持Modbus ASCII模式?
答:S7-200可以支持上述模式,没有现成的指令库,需要用户自己利用自由口的方式编程。
问2:项目编译后为何出现很多错误?
答:使用指令库时,若编译后出现很多错误,一般是因为未指定库指令数据存储区。
问3:Modbus从站的网络地址与S7-200的CPU网络地址有何关系?
答:没有关系。支持网络通信的通信协议必须有其自己的网络寻址规定。Modbus从站的地址只是它在Modbus网络上的地址,而通常所说的S7-200CPU地址是CPU在西门子的PPI网络上的站地址。
问4:MBUS_MSG指令中代表数据长度的COUNT引脚单位是什么?
答:对于Modbus地址=0xxxx或1xxxx的,引脚单位为Bit;对于Modbus地址=3xxxx或4xxxx的,引脚单位为Word。
问5:如何访问大于9999的保持寄存器地址?
答:ModbusMaster协议库支持超过9999的保持寄存器地址。地址范围为400001-465536。只需在调用MBUS_MSG子程序时给Addr参数赋相应的值即可,如416768。
问6:为何有些HMI软件使用Modbus RTU读取S7-200中的实数会出现错误?
答:不同的厂家关于浮点数格式定义的不同,西门子的PLC遵循的是高位低存的规律,和其他的厂家有可能会不一样,这样读回来的实数或整数的高低字节会发生反转,这个时候可以通过监控、判断,在程序当中把它掉过来就可以了。
问7:MBUS_MSG显示Error 6#?
答:Error6#表示Modbus正在忙于其它请求。MBUS_MSG指令只能允许有一个读写操作处于运行过程,如果在一个读写操作尚未完成时启用一个读写请求,就会发生Error6#。利用Done位可以对规避这一问题。
问8:MBUS_MSG显示Error 3#?
答:Error3#表示从站无应答。即主站的读写请求发出后,从站没有在Timeout时间内返回报文。多种原因可以引起此故障,包括:
硬件故障(线路,端口等问题)。
错误的从站地址,波特率,奇偶校验。
从站不支持此功能码,或不能被从站识别的从站数据地址。
Timeout时间过短(从站响应较慢),通过延长Timeout可以解决这个问题。