Modbus通信及数据存储读取

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值