C#写字符串到Modbus中

  • modbus不直接支持写入字符串,必须要用间接方式存字符串,比如将字符串转为字节数组;
  • modbus存储值一般是ushort,16位整数,存值范围0~ 65535
  • 使用编码ASCII来将字符串转为字节数组,ASCII编码不支持中文,如果是中文需要考虑存储地址个数是否够用,中文需要使用UTF-8,或者GBK编码来存储;
  • 将字母、数字、符号混合的编码写入modbus中是支持的,比如guid字符串,"QTRK250819003","CGSQ-250819-008"
  • 将modbus存的字节数组还原为中文,只需要要读取字节数组出来,然后用编码处理转为中文就行

ASCII(美国信息交换标准代码)不支持中文,其设计初衷和编码范围决定了它无法直接表示中文字符。以下是具体原因和补充说明:

1. ASCII的编码范围限制

ASCII使用7位二进制数(共128个编码)表示字符,包括:

32个控制字符(如换行、回车等)。

95个可打印字符(数字0-9、大小写字母A-Z/a-z、标点符号、空格等)。

中文字符数量庞大(常用汉字约3500个,加上繁体、生僻字等远超此数),远超ASCII的编码容量。
2. 中文编码的解决方案

GB2312/GBK:中国国家标准,使用双字节编码(16位),覆盖约6763个汉字(GB2312)和扩展字符(GBK)。

Big5:台湾地区使用的繁体中文编码,同样为双字节。

Unicode/UTF-8:现代通用标准:

Unicode为全球所有字符分配唯一编码(包括中文)。

UTF-8是Unicode的一种可变长度编码,中文通常占3字节,兼容ASCII(ASCII字符在UTF-8中仍占1字节)。

csharp 复制代码
        /// <summary>
        /// 写入字符串值,会从address地址开始写入,连续写入多个寄存器;
        /// </summary>
        /// <param name="address"></param>
        /// <param name="value"></param>
        public static void WriteValueString(ushort address, string value)
        {
            byte[] bytes = Encoding.ASCII.GetBytes(value);
            var  bytes2 = ByteArrayToRegisters2(bytes);
            using (TcpClient client = new TcpClient(ip, port))
            {
                client.ReceiveTimeout = timeout; // 设置接收超时为1秒
                client.SendTimeout = timeout; // 设置发送超时为1秒

                IModbusMaster master = ModbusIpMaster.CreateIp(client);

                // 写入 
                master.WriteMultipleRegisters(slaveAddress, address, bytes2);
                LogHelpter.AddLog($"写入地址{address}成功,值={value}");
            }
        }
        public static ushort[] ByteArrayToRegisters2(byte[] data)
        {
            List<ushort> ushorts = new List<ushort>();
            for (int i = 0; i < data.Length; i++)
            {
                var value = (ushort)(data[i]);
                ushorts.Add(value);
            }
            return ushorts.ToArray();
        }
csharp 复制代码
        /// <summary>
        /// 读取modbus存的字符串,会从address地址开始读取,连续读取多个寄存器;
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public string ReadString(ushort address)
        {
            using (TcpClient client = new TcpClient(ip, port))
            {
                client.ReceiveTimeout = timeout; // 设置接收超时为1秒
                client.SendTimeout = timeout; // 设置发送超时为1秒

                IModbusMaster master = ModbusIpMaster.CreateIp(client);

//这里需要根据字符串长度配置,512,
                ushort[] arr = master.ReadInputRegisters(slaveAddress, address, 512);
                List<byte> bytes = new List<byte>();
                foreach (var item in arr)
                {
                    bytes.Add((byte)item);
                }
                string code = Encoding.ASCII.GetString(bytes.ToArray());
                return code;
            }
        }
相关推荐
唐青枫3 小时前
别只会看日志:C#.NET SOS 调试扩展从 Dump 到内存泄漏排查
c#·.net
AlanBruce7 小时前
摩尔信使MThings EdgeWeb使用指南
上位机·plc·modbus·mthings·摩尔信使
AlanBruce7 小时前
摩尔信使MThings逻辑控制各组件使用指南
自动化·上位机·modbus·mthings·摩尔信使
AlanBruce7 小时前
摩尔信使MThings DL/T 698.45数据配置使用指南
上位机·plc·modbus·mthings·摩尔信使
yswenli10 小时前
基于C#开发网站视频嗅探下载工具——BrowserVideoGrabber
c#·videodownload·webvideodownload·videograbber
Lost of 程序猿10 小时前
M2 实战:询价与采购订单聚合落地——跨聚合一致性、领域事件与 Outbox
开发语言·c#·asp.net·.net
AlanBruce11 小时前
摩尔信使MThings CJ/T 188数据配置使用指南
自动化·modbus·摩尔信使
Polevne12 小时前
C# GRPC 一元与双向流
linux·算法·c#
XiaoZhenHua981 天前
C#工业机器视觉Recipe配方系统设计:多型号、多相机、多工位参数如何统一管理
c#·软件架构·机器视觉·工业自动化·工业软件·recipe
fujisheng6611 天前
FUI 导航实践:拆开 Layer、History、Coverage 与 Cache 的组合语义
c#·unity3d