天天看点

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

1、松下PLC使用COM0端口,RS232接线。电脑端使用USB转RS232串口线。

硬件接线,RS232接线:

电脑端串口线:     PLC侧COM0:

2 RXD 接收数据    SD 发送数据

3 TXD 发送数据    RD 接收数据

5 GND 信号地     SG 信号地

2、PLC侧参数设置:

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

站号:1;

通讯模式:MODBUS RTU;

速率(波特率):9600;

数据长度:8位;

奇偶校验:奇校验;

停止位:1

3、八方汇串口调试软件侧设置:

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试
松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

通讯参数设置和PLC要一致,设备地址就是需要通讯的PLC的站号,这里是01(PLC侧 NO.410站号 1)。

4、八方汇调试神器有一点需要注意的地方:显示的起始地址范围要包含读写寄存器地址的范围,否则,将会出现读写寄存器地址无法写入地址的情况。如下图:

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

图中①中的地址范围是从0开始,显示连续的8个地址。②中的地址范围是从0开始,读写1个地址。

那么我就可以在②的读写寄存器地址里输入任意的0-7的数字,但不能超过7,超过7就会报错。因为①中地址范围最大就是7。

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

输入7以内的数字,都可以正常输入。

但是,当输入7以上的数字时就会报错。这一点对这个软件需要特别注意。

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

如果需要更大的地址,只需把①中的显示范围包含②中需要填的地址,就可以正常在②中输入了。

5、在FP-XH的用户手册-通讯篇中,有关于PLC进行MODBUS通讯时的地址对照表

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

这张表里包含了读写不同类型地址时需要使用的功能码和对应地址。需要注意的是红色框里代码就是MODBUS通讯时的功能码,这里是以10进制列出的,应用的时候注意转换成16进制。例如:代码16是DT多字写入,用串口软件发报文时,功能码应转换成16进制,也就是10,十进制的16=十六进制的10

6、MODBUS 功能码及其含义

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

MODBUS RTU 错误应答的规定:

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试
松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

松下FP-XH PLC侧响应规则

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

下面进入重点,各个功能和地址读写操作的应用例子

如:读取PLC的Y6的状态

发送:01 01 00 06 00 01 1D CB

接收:01 01 01 01 90 48

下图是MODBUS RTU协议规定的报文数据格式

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

报文解读:

发送数据格式解读

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

图片中显示出了发送数据各个码占用的位数(每两位代表1个字节的数据长度=8bit),这里都是16进制。如上图,起始地址占用4个位。

起始码:3.5个字符以上时间的间隔。

地址码01:读取站号为1设备的数据。

功能码01:读的是线圈类型的数据。

起始地址00 06:读取数据的起始地址是6,类型是Y点。为什么是Y点,是因为上面的PLC地址对照表里规定的,线圈中0000-06DF对应Y0-Y109F,看下图红色框里。

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

读取个数00 01:读取数据的数量是1个。

校验码1D CB: CRC检验的值。

停止码:3.5个字符以上时间的间隔。

接收数据格式解读

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

图片中显示出了接收数据各个码占用的位数(每两位代表1个字节的数据长度=8bit),这里都是16进制。如上图,返回数据占用2个位。

起始码:3.5个字符以上时间的间隔。

地址码01:返回站号为1设备的数据。

功能码01:返回的是线圈类型的数据。

读取个数01:返回数据的长度是1个字节。(读取个数这里的数字代表返回的数据长度,单位是字节。1个字节=8bit)。

返回数据01:返回的数据为H01,【因为返回1个字节的数据,所以这个数据存储在低8位中,因为读取数据的起始地址是Y6,返回的数据=H01=B00000001,所以Y6=bit0=1】

校验码90 48: CRC检验的值。

停止码:3.5个字符以上时间的间隔。

即我们读取的1号站线圈类型,地址为Y6的线圈当前状态为ON。

如果需要读取Y300-Y309一共10个点状态要怎么发送报文?

发送:01 01 01 E0 00 0A BC 07

接收:01 01 02 A4 00 C3 3C

发送前,串口软件地址设置,如下图:

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

发送后报文,如下图:

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

返回结果,如下图

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

PLC侧数据状态

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

串口软件显示状态与PLC监控状态一致。

报文解读:

发送数据格式解读

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

图片中显示出了发送数据各个码占用的位数(每两位代表1个字节的数据长度=8bit,每4位代表1个字的数据长度),这里都是16进制。

起始码:3.5个字符以上时间的间隔。

地址码01:读取站号为1设备的数据。

功能码01:读的是线圈类型的数据。

起始地址01 E0:读取数据的起始地址是Y300,类型是Y点。为什么是Y点,是因为下图的PLC地址对照表里规定的,线圈中0000-06DF对应Y0-Y109F,看下图红色框里。【为什么地址是01 E0,下面有详细解释地址对应的问题】(*注1)

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

读取个数00 0A:读取数据的数量是连续的10个,从Y300开始到Y30A。(这里是16进制,HA=K10)

校验码BC 07: CRC检验的值。

停止码:3.5个字符以上时间的间隔。

接收数据格式解读

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

图片中显示出了接收数据各个码占用的位数(每两位代表1个字节的数据长度=8bit),这里都是16进制。

起始码:3.5个字符以上时间的间隔。

地址码01:返回站号为1设备的数据。

功能码01:返回的是线圈类型的数据。

读取个数02:返回数据的长度是2个字节(1个字节=8bit,2个字节=16bit=1个字)。

返回数据1 A4:返回的第一个数据是HA4。HA4=B10100100(H代表16进制,B代表2进制)

返回数据2 00:返回的第二个数据是H00。H00=B00000000

把返回数据1和返回数据2组合起来就是0000 0000 1010 0100(即bit2=Y302=1,bit5=Y305=1,bit7=Y307=1,这和上图串口软件中显示是一样的。)

MODBUS RTU 功能码01, 返回数据是按字节处理的,1个字=2个字节=16bit。上面返回2个字节,存放数据需要占用1个字,返回数据1存放在低8位中,返回数据2存放在高8位中。假如返回4个字节,数据存放需要占用2个字,返回数据1存放在第一个字的低8位中,返回数据2存放在第一个字的高8位中;返回数据3存放在第二个字的低8位中,返回数据4存放在第二个字的高8位中。当返回更多数据时,按此规律递推。因此我们处理接收到的数据时,需要把1个字的高8位和低8位进行互换,再重新组合成1个字,才能得到我们真正需要的数据,因为MODBUS RTU返回数据协议格式就是低位在前高位在后,而一个正常的数据是高位在前低位在后,所以需要处理。例如上面接收到的数据(数据1和数据2合起来)为HA400=B1010 0100 0000 0000,很显然这不是我们需要的数据。这是因为对于2进制来说左侧是高位右侧是低位,从左往右排就是从高位往低位排列。因此我们需要把1个字的高低字节互换处理,得到的数据是H00A4=0000 0000 1010 0100这才是真实的数据。

校验码C3 3C: CRC检验的值。

停止码:3.5个字符以上时间的间隔。

即我们读取的1号站线圈类型,起始地址为Y300连续读取10个数据,返回的数据为HA400=B1010 0100 0000 0000。

(*注1)下面开始解释地址对应的问题

需要读取数据的起始地址为Y300,为什么发送报文时的起始地址为01E0?

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

上表我们看到Y0-Y109F对应的BUS上的数据(16进制)为0000-06DF,即Y0对应0000,Y109F对应06DF。按照此表规定的规则,那么Y10对应0010,Y5F对应005F,Y90对应0090,Y9F对应009F;下面关键问题来了Y100对应多少?按照上面的规则我们很容易会说Y100对应0100,真是如此吗?正确的答案是Y100对应00A0。是不是出乎你的意外?

这是因为松下PLC的X/Y/R地址是16进制非连续排列的。Y的地址排列为Y0-YF,Y10-Y1F......Y90-Y9F这一段Y0-Y9F是连续排列的。那么按16进制排列9F后面的一个数应该是A0,但松下PLC的下一个起始地址是Y100,跳过了中间的一段(A0-FF)不是YA0!

继续往下排列Y100-Y19F又是连续排列的,但是从Y200开始又跳过了中间的一段(1A0-1FF),变成了Y200-Y29F。下面是Y300-Y39F,Y400-Y49F.......

即松下PLC地址每遇到9F(H9F=10进制159)数据地址就会跳段改变,也就是说从起始地址每隔160个数据(0-159一共160个),就会改变地址起始编号。那么按照此规则Y0-Y109F一共有多少个数据呢?答案:11*160=1760。这是因为,从Y0-Y109F,一共有11个地址段,每个地址段从对应的0开始到9F一共有160个数据,那么总数就是11*160=1760。

而上表中给出的PLC的Y地址对应的BUS地址却是连续排列的,从0000到06DF即十进制的0到1759,一共有1760个。把BUS地址和PLC地址一一对应起来,那么Y300就对应BUS的01E0。这就是上面问题的答案。

BUS地址在对应区间内都是连续排列的。

下面附上几张地址对应图,以方便理解。

这是X地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

这是Y地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

这是R地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。

R地址对应的BUS地址是0800-27FF,这里要特别注意

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

这是R地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。

R地址对应的BUS地址是0800-27FF,这里要特别注意

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

9、读单个R点,功能码用H01,接收到的数据需要高低字节互换。

发送:01 01 08 A0 00 01 FF 88

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 01 01 01 90 48

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收报文中的读取个数表示的是返回的字节数。如上图01表示返回1个字节。

读多个R点,功能码用H01,接收到的数据需要高低字节互换。

发送:01 01 08 A0 00 10 3F 84

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 01 02 01 05 78 6F

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收报文中的读取个数表示的是返回的字节数。如上图02表示返回2个字节。

读单个X点,功能码用H02,接收到的数据需要高低字节互换。

发送:01 02 00 0F 00 01 89 C9

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 02 01 01 60 48

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收报文中的读取个数表示的是返回的字节数。如上图01表示返回1个字节。

读多个X点,功能码用H02,接收到的数据需要高低字节互换。

发送:01 02 00 00 00 10 79 C6

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 02 02 00 80 B8 18

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收报文中的读取个数表示的是返回的字节数。如上图02表示返回2个字节。

读单个DT数据,功能码用H03,注意:H03功能码,返回的数据不需要进行高低字节互换,可以直接使用。每个返回数据存放占用1个字。

发送:01 03 00 42 00 01 24 1E

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 03 02 31 24 AD CF

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

H3124=K12580

接收报文中的读取个数表示的是返回的字节数。如上图02表示返回2个字节。

读多个DT数据,功能码用H03,注意:H03功能码,返回的数据不需要进行高低字节互换,可以直接使用。每个返回数据存放占用1个字。

发送:01 03 00 42 00 0A 65 D9

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 03 14 31 24 00 00 00 00 00 00 00 9F 00 00 00 00 01 AA 00 00 00 00 75 6A

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试
松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试
松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

返回数据太多了,1张图截不完,按顺序看图就好了。

接收报文中的读取个数表示的是返回的字节数。如上图14表示返回20个字节。(H14=K20)

单点写Y点,功能码用H05。正常时,接收的报文和发送的报文完全一样。写入的值为FF 00表示单个线圈置ON,这是规定的。

发送:01 05 02 80 FF 00 8C 6A

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

写入的值为FF 00表示单个线圈置ON,这是规定的。

接收:01 05 02 80 FF 00 8C 6A

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

单点写Y点,功能码用H05。正常时,接收的报文和发送的报文完全一样。写入的值为00 00表示单个线圈置OFF,这是规定的。

发送:01 05 02 80 00 00 CD 9A

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 05 02 80 00 00 CD 9A

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

如:需要把一个线圈置ON,在八方汇串口调试神器上要怎么操作?

如下图需要把Y400置1,具体操作流程如下:

1. 填入地址,Y400对应BUS 16进制地址0280,Y400是起始位=bit0位

2. 鼠标左键单击bit0位,bit0位的显示状态就会从OFF变为ON

3. 点击红色框的发送

4.串口软件自动生成报文,并把报文发送出去。

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

当需要把1个线圈置OFF时,只需点击对应位,使其从ON变为OFF,再重复上面的步骤就可以了。

*注意2: 左上角选择16进制时,显示地址总个数/读写寄存器地址个数 在串口软件上用10进制表示,发送和接收的报文都是用16进制处理的!这里需要特别注意。

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

多点线圈写Y点,功能码用H0F。

发送:01 0F 02 80 00 10 02 FF FF DF 90

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 0F 02 80 00 10 54 57

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

多点线圈写Y点,功能码用H0F。

发送:01 0F 02 80 00 11 03 00 00 00 9C 64

接收:01 0F 02 80 00 11 95 97

多点线圈写Y点,功能码用H0F。

发送:01 0F 0B 20 00 11 03 FF FF 01 4C 04

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 0F 0B 20 00 11 96 29

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

单点DT写入,功能码用H06。

功能码06,发送和接收报文一样。

发送:01 06 05 A4 21 CB 91 22

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

接收:01 06 05 A4 21 CB 91 22

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

多点DT写入,功能码用H10。

发送:01 10 05 A4 00 03 06 00 3D 0A 35 00 6F 8E 24

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试
松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

上图中的要写入的个数代表写入多少个字,如上图0003代表写入3个字=6个字节。

接收:01 10 05 A4 00 03 C1 27

松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

上图中的写入的个数代表写入多少个字,如上图0003代表写入3个字

例如:在PLC的32位寄存器DT10中写入值120000,要怎么写?

1、先把十进制转成16进制,K120000=H0001D4C0。因为发送的时候数据是按字发送的,32位=2个字=4个字节,不足4个字节的高位补0。第一个字存放顺序为D4 C0高位在前低位在后,第二个字存放顺序为00 01高位在前低位在后。因此DT10中存放数据D4 C0,DT11中存放00 01。

2、发送多个字使用功能码H10

3、发送报文:01 10 00 0A 00 02 04 D4 C0 00 01 8B DC

接收报文:01 10 00 0A 00 02 61 CA

继续阅读