網(wǎng)站首頁 編程語言 正文
1. 存儲區(qū)代號
代碼號 | 功能 |
---|---|
1區(qū) | 輸入線圈 |
0區(qū) | 輸出線圈 |
3區(qū) | 輸入寄存器 |
4區(qū) | 輸出寄存器 |
2. 功能碼
代碼 | 功能 |
---|---|
0x01 | 讀取輸出線圈 |
0x02 | 讀取輸入線圈 |
0x03 | 讀取輸出寄存器 |
0x04 | 讀取輸入寄存器 |
0x05 | 寫入單個線圈 |
0x06 | 寫入單個寄存器 |
0x0F | 寫入多個線圈 |
0x10 | 寫入多個寄存器 |
3. pymodbus服務(wù)器
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
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2023-03-16 Python?NumPy?數(shù)組索引的示例詳解_python
- 2022-04-26 JQuery實現(xiàn)頁面彈出框_jquery
- 2022-02-24 Go入門所踩過的坑:cannot find package "" in any of
- 2022-04-27 Django與DRF結(jié)合的全局異常處理方案詳解_python
- 2022-07-19 字符數(shù)組,字符串及其操作函數(shù),指針
- 2022-12-03 SQL?Server如何通過SQL語句直接操作另一臺服務(wù)器上的SQL?SERVER的數(shù)據(jù)_MsSql
- 2021-12-09 Linux內(nèi)存管理和尋址詳細(xì)介紹_Linux
- 2022-11-27 C++常見的stl容器與相關(guān)操作?示例解析_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支