编写Modbus通讯程序需要根据使用的协议(如Modbus RTU、Modbus TCP)和编程语言进行。以下是几种常见编程语言的Modbus通讯程序示例:
1. Python示例(Modbus TCP)
```python
from pymodbus.client.sync import ModbusTcpClient
创建Modbus TCP客户端对象
client = ModbusTcpClient('127.0.0.1', port=502)
连接Modbus TCP服务器
client.connect()
读取保持寄存器的数据
result = client.read_holding_registers(address=0, count=1, unit=1)
if result.isError():
print("读取保持寄存器失败: {}".format(result))
else:
print("读取保持寄存器成功: {}".format(result.registers))
写入保持寄存器的数据
result = client.write_register(address=0, value=123, unit=1)
if result.isError():
print("写入保持寄存器失败: {}".format(result))
else:
print("写入保持寄存器成功")
关闭连接
client.close()
```
2. C语言示例(Modbus TCP)
```c
include include include include include include include define SERVER_IP "127.0.0.1" define SERVER_PORT 502 define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; int bytes_received; // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket"); exit(1); } // 绑定套接字 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(SERVER_PORT); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); exit(1); } // 读取保持寄存器的数据 memset(buffer, 0, BUFFER_SIZE); bytes_received = read(sockfd, buffer, BUFFER_SIZE); if (bytes_received < 0) { perror("read"); exit(1); } printf("读取保持寄存器成功: %d\n", buffer); // 写入保持寄存器的数据 memset(buffer, 0, BUFFER_SIZE); buffer = 123; bytes_received = write(sockfd, buffer, 1); if (bytes_received < 0) { perror("write"); exit(1); } printf("写入保持寄存器成功\n"); // 关闭套接字 close(sockfd); return 0; } ``` 3. C示例(Modbus RTU)