硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1438|回复: 4
收起左侧

[其它] modbus 0x10功能码

[复制链接]

5

主题

38

回帖

53

积分

初级会员

积分
53
发表于 2024-8-14 17:03:39 | 显示全部楼层 |阅读模式
硬汉哥提供的历程中写到0x10最多支持23个寄存器是写错了吗 ,我查阅资料0x10最多支持123个寄存器



/*
*********************************************************************************************************
*        函 数 名: MODH_Send10H
*        功能说明: 发送10H指令,连续写多个保持寄存器. 最多一次支持23个寄存器。
*        形    参: _addr : 从站地址
*                          _reg : 寄存器编号
*                          _num : 寄存器个数n (每个寄存器2个字节) 值域
*                          _buf : n个寄存器的数据。长度 = 2 * n
*        返 回 值: 无
*********************************************************************************************************
*/
void MODH_Send10H(uint8_t _addr, uint16_t _reg, uint8_t _num, uint8_t *_buf)
{
        uint16_t i;
       
        g_tModH.TxCount = 0;
        g_tModH.TxBuf[g_tModH.TxCount++] = _addr;                /* 从站地址 */
        g_tModH.TxBuf[g_tModH.TxCount++] = 0x10;                /* 从站地址 */       
        g_tModH.TxBuf[g_tModH.TxCount++] = _reg >> 8;        /* 寄存器编号 高字节 */
        g_tModH.TxBuf[g_tModH.TxCount++] = _reg;                /* 寄存器编号 低字节 */
        g_tModH.TxBuf[g_tModH.TxCount++] = _num >> 8;        /* 寄存器个数 高字节 */
        g_tModH.TxBuf[g_tModH.TxCount++] = _num;                /* 寄存器个数 低字节 */
        g_tModH.TxBuf[g_tModH.TxCount++] = 2 * _num;        /* 数据字节数 */
       
        for (i = 0; i < 2 * _num; i++)
        {
                if (g_tModH.TxCount > H_RX_BUF_SIZE - 3)
                {
                        return;                /* 数据超过缓冲区超度,直接丢弃不发送 */
                }
                g_tModH.TxBuf[g_tModH.TxCount++] = _buf[i];                /* 后面的数据长度 */
        }
       
        MODH_SendAckWithCRC();        /* 发送数据,自动加CRC */
}

回复

使用道具 举报

5

主题

38

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2024-8-14 17:05:38 | 显示全部楼层
1f5e98e31afba35b5798625a119594e6.png
fe618da6d2261eb56f5b9d78ac2c9ca4.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-15 10:04:20 | 显示全部楼层
以规格书为准,这个好像是我们一个产品代码的注释,没改。
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2024-9-15 14:20:16 | 显示全部楼层
0x3和0x10命令中,都有一个数据长度字节,是字节,那就不能超过255,实际上一个寄存器是2个字节数据,所以这个数据长度最大是254,对应127个寄存器。只要你的缓冲区开的大不越界。读写都可以最大127个寄存器。除非编程时特别限定缓冲区大小。为啥标准协议里是123,可能那时候modicon设备的缓冲区是256字节的,除去地址命令校验乱七八糟的,最多只能容纳246个数据字节了
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2024-9-15 14:22:48 | 显示全部楼层
当年我用C8051F310做modbus从局,规定只能一次读写20个寄存器,因为通信缓冲区只有50字节,而且收发复用。再大没RAM可用了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:20 , Processed in 0.042614 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表