ModbusTCP与Modbus UDP的프레임형식是一样的,它们之间的区别其实就是TCP与UDP的区别,因此下面就针对ModbusTCP的프로토콜进行分析,Modbus TCP与Modbus Rtu(ModbusASCII)之间的区别如下图:

从上图可以看出,ModbusTCP在Modbus串行통신的基础上,去除了체크섬(由于TCP本身就带有체크섬)和设备주소(ModbusTCP弱化了设备주소,用IP주소来取代),再加上MBAP헤더(占7 bytes),下面针对MBAP进行分析설명:
| 域 | 길이 | 설명 | 客户机 | 服务器 |
|---|---|---|---|---|
| 事务处理标识符 | 2바이트 | Modbus请求/响应事务处理的标识 | 客户机启动 | 복사响应 |
| 프로토콜 식별자 | 2바이트 | 0=Modbus프로토콜 | 客户机启动 | 복사响应 |
| 길이 | 2바이트 | 길이之后的바이트总数 | 客户机启动 | 服务器启动 |
| 유닛 식별자 | 1바이트 | 串行链路或其它总线的슬레이브识别 | 클라이언트启动 | 복사响应 |
下面针对具体프레임进行分析,Modbus프로토콜在以太网链路上的프레임형식如下所示:
| 事务处理标识符 | 프로토콜 식별자 | 길이 | 유닛 식별자 | 기능 코드 | 데이터 |
|---|---|---|---|---|---|
| 2 바이트 | 2 바이트 | 2 바이트 | 1 바이트 | 1 바이트 | N bytes |
有了以上理论基础之后,下面针对各个기능 코드进行详细分析:
읽기출력코일
보내기프레임형식如下:

보내기프레임含义:읽기服务器1号슬레이브출력코일,시작주소为0x13=19,对应주소为00020,코일 수량为0x1B=27,即읽기1号슬레이브출력코일,주소从00020-00046,共27个코일的状态值。
这里值得注意一下,프로토콜中的시작주소指的是索引,后面的주소指的是具体주소,对于任意一个存储区,索引都是从0开始的,但是对应的具体주소,与存储区是相关的,比如출력코일,0对应00001;입력코일,0对应10001;입력 레지스터,0对应30001;유지 레지스터,0对应40001。
返回프레임형식如下:

返回프레임含义:返回服务器1号슬레이브출력코일00020-00046,共27个코일的状态值,返回바이트数为4个,分别为CD 6B B2 05。
CD=1100 1101 对应 00020-00027
6B=0110 1011 对应 00028-00035
B2=1011 0010 对应 00036-00043
05=0000 0101 对应 00044-00046
읽기입력코일
보내기프레임형식如下:

보내기프레임含义:읽기服务器1号슬레이브입력코일,시작주소为0xC4=196,对应주소为10197,코일 수량为0x1D=29,即읽기1号슬레이브입력코일,주소从10197-10225,共29个코일的状态值。
返回프레임형식如下:

返回프레임含义:返回服务器1号슬레이브입력코일10197-10225,共29个코일的状态值,返回바이트数为4个,分别为CD 6B B2 05。
CD=1100 1101 对应 10197-10204
6B=0110 1011 对应 10205-10212
B2=1011 0010 对应 10213-10220
05=0000 0101 对应 10221-10225
유지 레지스터 읽기 (FC03)
보내기프레임형식如下:

보내기프레임含义:읽기服务器1号슬레이브유지 레지스터,시작주소为0x6B=107,对应주소为40108,레지스터 수량为0x02=2,即읽기1号슬레이브유지 레지스터,주소从40108-40109,共2个레지스터的数值。
返回프레임형식如下:

返回프레임含义:返回服务器1号슬레이브유지 레지스터40108-40109,共2个레지스터的数值,返回바이트数为4个,分别为02 2B 01 06,40108对应数值为0x022B,40109对应数值为0x0106。
입력 레지스터 읽기 (FC04)
보내기프레임형식如下:

보내기프레임含义:읽기服务器1号슬레이브입력 레지스터,시작주소为0x6B=107,对应주소为30108,레지스터 수량为0x02=2,即읽기1号슬레이브유지 레지스터,주소从30108-30109,共2个레지스터的数值。
返回프레임형식如下:

返回프레임含义:返回服务器1号슬레이브입력 레지스터30108-30109,共2个레지스터的数值,返回바이트数为4个,分别为02 2B 01 06,30108对应数值为0x022B,30109对应数值为0x0106。
预置单코일
보내기프레임형식如下:

보내기프레임含义:预置服务器1号슬레이브单个코일的值,코일주소为0x00AC=172,对应주소为00173,断通标志0xFF00表示置位,0x000表示复位,即置位1号슬레이브출력코일00173。
返回프레임형식如下:

返回프레임含义:预置单출력코일原프레임返回。
단일 레지스터 설정
보내기프레임형식如下:

보내기프레임含义:预置服务器1号슬레이브单个유지 레지스터的值,레지스터주소为0x0087=135,对应주소为40136,쓰기值为0x039E,即预置1号슬레이브유지 레지스터40136值为0x039E。
返回프레임형식如下:

返回프레임含义:预置单유지 레지스터原프레임返回。
预置多코일
보내기프레임형식如下:

보내기프레임含义:预置服务器1号슬레이브多个코일的值,코일주소为0x0013=19,对应주소为00020,코일数为0x0A=10,쓰기值为0xCD00,即预置1号슬레이브코일00020-00027=0xCD=1100 1101,00028-00029=0x00=0000 0000。
返回프레임형식如下:

返回프레임含义:预置多출력코일返回프레임是在原프레임基础上除去바이트数及具体바이트后返回。
다중 레지스터 설정
보내기프레임형식如下:

보내기프레임含义:预置服务器1号슬레이브多个레지스터的值,레지스터주소为0x0087=135,시작주소为40136,레지스터 수량为0x02=2,종료주소为40137,쓰기值为0xCD00和0x0A10,即预置1号슬레이브레지스터40136=0x0105,40137=0x0A10。
返回프레임형식如下:

返回프레임含义:预置多유지 레지스터返回프레임是在原프레임基础上除去바이트数及具体바이트后返回。
답글 작성