news 2026/7/27 4:31:21

最近在折腾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/7/25 21:47:18

203套房源全数去化,招商林屿缦岛诠释何为“现象级热盘”

在西安楼市&#xff0c;能够被称为“现象级”的项目并不多。2026年2月8日&#xff0c;招商林屿缦岛用一份“首开售罄”的成绩单&#xff0c;为自己赢得了这一称号。203套房源在开盘当日全数去化&#xff0c;这一现象不仅引发了市场热议&#xff0c;更促使我们思考&#xff1a;在…

作者头像 李华
网站建设 2026/7/25 19:20:42

HoRain云--2026最佳Markdown预览方案

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/7/25 22:55:49

意义与道:临界点的涌现机制

意义与道&#xff1a;临界点的涌现机制 一、意义的可理解性&#xff1a;道的人间显化 1. 道的抽象性与意义的具象性 • 道是宇宙运行的根本规律&#xff0c;是“一阴一阳之谓道”的终极抽象&#xff0c;无形无相&#xff0c;需要极高的悟性与修行才能体认。 • 意义是道在特定…

作者头像 李华
网站建设 2026/7/16 11:15:24

好写作AI:还在“我觉得”?让数据帮你说话,写作从此有据可查!

写专业内容时&#xff0c;你是不是也经常陷入“自我感觉”的漩涡&#xff1f; “市场前景非常广阔…”、“用户反馈普遍积极…”、“这个功能效果显著…” 写的时候信心满满&#xff0c;发出去后被灵魂拷问&#xff1a;“有数据吗&#xff1f;”瞬间哑火。 在“观点通胀”的时…

作者头像 李华