三菱PLCmodbusrtu通讯示例代码
时间: 2023-07-09 10:42:58 浏览: 168
以下是三菱PLC与Modbus RTU设备通讯的示例代码:
```LD
LD M100 // 读取保持寄存器的值
MOV D10 1 // 设置Modbus设备的地址为1
MOV D11 3 // 设置读取保持寄存器的功能码为3
MOV D12 0 // 设置保持寄存器的起始地址为0
MOV D13 1 // 设置读取保持寄存器的数量为1
MOV D14 0 // 初始化CRC校验码为0
LD M101 // 判断串口是否空闲
OUT C10 // 发送起始符
OUT C11 // 发送地址
OUT C12 // 发送功能码
OUT C13 // 发送起始地址的高位
OUT C14 // 发送起始地址的低位
OUT C15 // 发送读取数量的高位
OUT C16 // 发送读取数量的低位
CALL #0010 // 计算CRC校验码
OUT C17 // 发送CRC校验码的低位
OUT C18 // 发送CRC校验码的高位
MOV D15 0 // 初始化接收计数器为0
MOV D16 0 // 初始化接收数据位为0
LD M102 // 判断串口是否有数据
IN C10 // 读取接收数据
MOV D17 C10 // 保存接收数据
INC D16 // 增加接收数据位
CMP D16 8 // 判断是否接收完整一帧数据
BNE M102 // 如果未接收完整,则跳转循环继续接收
MOV D16 0 // 重置接收数据位为0
INC D15 // 增加接收计数器
CMP D15 2 // 判断是否接收了2个字节的CRC校验码
BEQ M103 // 如果接收了2个字节的CRC校验码,则跳转校验CRC
BRA M102 // 否则继续接收下一个字节
M103:
CALL #0010 // 计算接收的CRC校验码
CMP D14 D18 // 判断接收的CRC校验码是否正确
BNE M104 // 如果接收的CRC校验码不正确,则跳转异常处理
MOV D20 D19 // 保存接收到的数据
LD M103 // 判断串口是否空闲
OUT C10 // 发送ACK确认码
MOV D19 0 // 初始化异常计数器
RET
M104:
INC D19 // 增加异常计数器
CMP D19 3 // 判断异常计数器是否达到3次
BNE M102 // 如果未达到3次,则跳转循环继续接收
MOV D20 0 // 清空接收到的数据
LD M104 // 判断串口是否空闲
OUT C10 // 发送NAK确认码
MOV D19 0 // 重置异常计数器为0
RET
```
以上是一个简单的Modbus RTU通讯的示例代码,用于读取保持寄存器的值。其中,M100表示保持寄存器的地址,M101表示串口是否空闲的开关,M102表示串口是否有数据的开关,M103表示串口是否空闲的开关,M104表示串口是否空闲的开关。D10-D20为数据寄存器,用于保存Modbus RTU协议的各种参数和数据。C10-C18为通讯端口,用于发送和接收数据。CALL #0010表示调用一个计算CRC校验码的子程序。
阅读全文