news 2026/5/12 6:00: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/5/12 6:00:08

使用Nginx搭配GeoIP2实现根据IP自动跳转国家站点

前言 在现代Web应用中&#xff0c;根据用户的地理位置提供不同的内容是一种常见的需求。本文将详细介绍如何使用Nginx和GeoIP2模块实现按国家或地区的智能路由的功能&#xff0c;我们可以实现更加精准的内容分发、个性化的用户体验和合规化的服务策略。 这里只实现了根据国家或…

作者头像 李华
网站建设 2026/5/10 20:21:56

JAVA核心技术实战

一、为什么这些 “老技术” 至今仍是面试 / 开发的核心&#xff1f;​ Java 生态迭代迅速&#xff0c;但真正支撑企业级项目稳定运行的&#xff0c;始终是那些 “不变的核心”—— 它们不依赖最新 JDK 版本&#xff0c;却贯穿所有 Java 开发场景&#xff0c;也是大厂面试的 “…

作者头像 李华
网站建设 2026/5/12 3:07:35

基于python的海鱼类科普网站的 海洋生物知识科普系统

目录系统概述核心功能模块技术实现要点部署与维护开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 一个基于Python的海鱼类科普网站旨在通过交互式平台向公众普及海洋生物知识&#xff0c;整合图文、视频、数据库…

作者头像 李华
网站建设 2026/5/11 1:57:27

transformer(下)

接下来是decoderdecoder其实有两种&#xff0c;接下来介绍的是autoregressive的decoder以语音辨识为例子&#xff0c;机器收到一段声音讯号作为输入到encoder&#xff0c;此时输出就是一排vector&#xff0c;接下来就是decoder的运作&#xff0c;产生语音辨识的结果首先先给他一…

作者头像 李华