news 2026/3/2 3:50:18

最近在折腾C#和欧姆龙PLC通信,发现网上完整的HostLink协议实现案例不多,自己啃手册写了套基础通信框架。直接上干货,先扔个读取DM区的代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最近在折腾C#和欧姆龙PLC通信,发现网上完整的HostLink协议实现案例不多,自己啃手册写了套基础通信框架。直接上干货,先扔个读取DM区的代码

C#上位机与omron欧姆龙 Host Link通信串口通讯实例 源码 通过和PLC用串口连接,可以读取写入欧姆龙PLC的数据寄存器DM(批量也可以)、输入输出CIO、辅助继电器WR,H保持继电器等。 c#基于VS2015以上版本

// 串口配置 SerialPort sp = new SerialPort(); sp.PortName = "COM3"; sp.BaudRate = 9600; sp.DataBits = 7; sp.Parity = Parity.Even; sp.StopBits = StopBits.Two; // 构造读取DM100的FINS命令 string header = "@00"; // 站号 string command = "RD"; // 读取命令 string address = "DM0100"; // 要读取的地址 string length = "0001"; // 读取长度 string finsFrame = $"{header}{command}{address}{length}"; byte[] cmdBytes = Encoding.ASCII.GetBytes(finsFrame); // 计算FCS校验(异或校验) byte fcs = 0; foreach (byte b in cmdBytes) { fcs ^= b; } string fullCmd = $"*{finsFrame}{fcs:X2}\r"; sp.Open(); sp.Write(fullCmd); Thread.Sleep(200); // 等待响应 string response = sp.ReadExisting(); sp.Close();

这段代码的核心在于FINS指令的构建。注意欧姆龙的地址格式比较特别,DM区地址需要转换成四字符的ASCII码。比如DM100要写成"DM0100",这个零填充的写法新手容易栽跟头。

C#上位机与omron欧姆龙 Host Link通信串口通讯实例 源码 通过和PLC用串口连接,可以读取写入欧姆龙PLC的数据寄存器DM(批量也可以)、输入输出CIO、辅助继电器WR,H保持继电器等。 c#基于VS2015以上版本

解析响应数据的代码更有意思:

// 假设收到响应数据 "*00RD00ABCD5E\r" string rawData = response.TrimStart('*').Split('\r')[0]; string content = rawData.Substring(6, 4); // 提取数据部分"00AB" ushort value = Convert.ToUInt16(content, 16); // 转换为数值

这里有个坑点——响应的数据是按字(Word)返回的,但实际存储是低位在前。比如收到"ABCD"对应的是0xCDAB,需要用BitConverter处理字节序:

byte[] bytes = new byte[2]; bytes[0] = (byte)Convert.ToInt32(content.Substring(2,2), 16); bytes[1] = (byte)Convert.ToInt32(content.Substring(0,2), 16); ushort correctValue = BitConverter.ToUInt16(bytes, 0);

批量读取的代码结构类似,改下长度参数就行:

// 读取DM100开始的5个字 string length = "0005"; // 响应数据处理时需要循环读取每个字 List<ushort> results = new List<ushort>(); for(int i=0; i<5; i++){ string wordData = rawData.Substring(6 + i*4, 4); // ...转换逻辑同上 }

写入操作稍微复杂些,需要构造数据体。以写入CIO区为例:

string command = "WR"; string address = "CIO0100"; ushort writeValue = 1234; string data = BitConverter.GetBytes(writeValue).Reverse().Aggregate("", (s, b) => s + b.ToString("X2")); // 处理字节序 string finsFrame = $"{header}{command}{address}{data}"; // 后续校验和发送流程与读取类似

实际调试时建议先用串口调试助手验证协议格式,再用C#代码实现。遇到通信失败先检查:

  1. 串口参数是否与PLC设置一致(特别是停止位和校验方式)
  2. FCS校验计算是否正确
  3. 地址格式是否符合要求(比如DM区必须是6字符)

完整工程里建议封装成通信类,用Queue处理命令队列,异步方式避免界面卡死。不过这就是另一个话题了,有空再细聊。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 2:16:32

直接上结论:千笔AI,研究生论文写作神器!

你是否正在为论文的选题而发愁&#xff1f;是否在撰写过程中常常感到思路混乱、表达无力&#xff1f;又或者&#xff0c;反复修改却总对结果不满意&#xff1f;研究生阶段的论文写作&#xff0c;不仅是学术能力的考验&#xff0c;更是时间与精力的挑战。面对查重率、格式规范、…

作者头像 李华
网站建设 2026/2/25 2:46:29

FUXA RRO 1.2.9专业版源码发布|2026年1月7日最新更新|全平台兼容·工程师友好型工业HMI系统

温馨提示&#xff1a;文末有联系方式最新版本发布动态 FUXA RRO 1.2.9专业版源码已于2026年1月7日正式发布&#xff0c;本次更新聚焦性能强化、协议拓展与用户体验升级&#xff0c;是当前工业可视化领域极具实用价值的开源HMI解决方案。全平台兼容性验证 【重要通知】本版本已在…

作者头像 李华
网站建设 2026/2/28 1:24:03

计算机毕业设计springboot基于微信小程序的电影艺术交流与推荐系统 基于SpringBoot与微信生态的个性化影艺分享与智能推荐平台 SpringBoot驱动的小程序端电影文化社群构建

计算机毕业设计springboot基于微信小程序的电影艺术交流与推荐系统3unot7j0 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着移动互联网技术的飞速发展&#xff0c;人们获取信…

作者头像 李华
网站建设 2026/3/1 10:40:44

CI自动化:跑脚本+签名+归档全搞定

你要是做过 Unity、iOS、Android、或者任何需要“打包交付”的活&#xff0c;大概率都经历过这种人生惨剧&#xff1a; 早上 10 点&#xff1a;产品说“给测试一个包看看”中午 12 点&#xff1a;测试说“再来一个修复版”下午 3 点&#xff1a;运营说“渠道包要十个&#xff0…

作者头像 李华
网站建设 2026/2/26 5:28:14

大模型微调+提示词工程:AI如何重塑我的后端开发工作流

在AI技术爆发前,我的后端开发日常充斥着“重复造轮子”:写相似的CRUD接口、维护冗长的接口文档、花1小时调试一个简单的参数校验Bug。但现在,基于大模型微调+提示词工程的定制化AI助手,已经把我的工作效率提升了60%——这就是AI对后端开发工作流的重塑。 一、痛点:传统后…

作者头像 李华