網站首頁 編程語言 正文
1. 存儲區代號
代碼號 | 功能 |
---|---|
1區 | 輸入線圈 |
0區 | 輸出線圈 |
3區 | 輸入寄存器 |
4區 | 輸出寄存器 |
2. 功能碼
代碼 | 功能 |
---|---|
0x01 | 讀取輸出線圈 |
0x02 | 讀取輸入線圈 |
0x03 | 讀取輸出寄存器 |
0x04 | 讀取輸入寄存器 |
0x05 | 寫入單個線圈 |
0x06 | 寫入單個寄存器 |
0x0F | 寫入多個線圈 |
0x10 | 寫入多個寄存器 |
3. pymodbus服務器
from pymodbus.server.async_io import StartTcpServer
from pymodbus.datastore import (
ModbusSequentialDataBlock,
ModbusServerContext,
ModbusSlaveContext,
)
datablock = ModbusSequentialDataBlock.create()
context = ModbusSlaveContext(
di=datablock,
co=datablock,
hr=datablock,
ir=datablock,
)
single = True
# Build data storage
store = ModbusServerContext(slaves=context, single=single)
if __name__ == '__main__':
address = ("127.0.0.1", 1502)
StartTcpServer(
context=store, # Data storage
address=address, # listen address
allow_reuse_address=True, # allow the reuse of an address
)
4. libmodbus客戶端
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus/modbus.h>
#include <time.h>
// const uint16_t UT_INPUT_REGISTERS_ADDRESS = 0x1;
const uint16_t UT_BITS_ADDRESS = 0x04;
// const uint16_t UT_INPUT_REGISTERS_NB = 0xA;
// const uint16_t UT_INPUT_REGISTERS_TAB[] = { 0x000A };
int main(int argc, char const *argv[])
{
int nb = 0x08;
int rc = 0;
modbus_t *ctx;
uint8_t *tab_rp_bits;
tab_rp_bits = (uint8_t *) malloc(nb * sizeof(uint8_t));
memset(tab_rp_bits, 0, nb * sizeof(uint8_t));
ctx = modbus_new_tcp("127.0.0.1", 1502);
if(ctx == NULL)
{
fprintf(stderr, "Unable to allocate libmodbus context\n");
return -1;
}
if(modbus_connect(ctx) == -1)
{
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
uint8_t data[8] = {1, 0, 1, 0, 1, 1, 0, 1};
while(1)
{
// rc = modbus_write_bit(ctx, UT_BITS_ADDRESS, 1);
rc = modbus_write_bits(ctx, UT_BITS_ADDRESS, nb, data);
printf("nb points %d : ", rc);
rc = modbus_read_bits(ctx, UT_BITS_ADDRESS, 8, tab_rp_bits);
if (rc != 1)
{
for (size_t i{0}; i < 8; i++)
// printf("FAILED (nb points %d)\n", rc);
printf("%d ", tab_rp_bits[i]);
}
printf("\n");
memset(tab_rp_bits, 0, nb * sizeof(uint8_t));
sleep(1);
}
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
原文鏈接:https://blog.csdn.net/weixin_40511249/article/details/128190018
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-03-22 教你利用Golang可選參數實現可選模式_Golang
- 2022-04-14 Python實現用戶名和密碼登錄_python
- 2023-03-13 使用webpack配置react-hot-loader熱加載局部更新_React
- 2022-10-28 Templates實戰之更優雅實現自定義View構造方法詳解_Android
- 2022-01-30 composer 安裝包,提示找不到對應的包,很奇怪的問題,備忘
- 2022-12-03 Nginx部署SSL證書的過程_nginx
- 2023-01-13 Pytorch如何加載自己的數據集(使用DataLoader讀取Dataset)_python
- 2022-08-19 WPF基于物理像素繪制圖形_C#教程
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支