当前位置: 首页 > news >正文

基于 C# 实现的 Omron HostLink (FINS) 协议 PLC 通讯

该类封装了 Socket 通讯底层、报文校验码计算以及发送接收的逻辑。

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;namespace HostLinkDemo
{public class OmronHostLink : IDisposable{private TcpClient _client;private NetworkStream _stream;// PLC的IP地址和端口(默认9600)public string IpAddress { get; set; }public int Port { get; set; }// 超时时间(毫秒)public int Timeout { get; set; } = 3000; public OmronHostLink(string ip, int port = 9600){IpAddress = ip;Port = port;_client = new TcpClient();}/// <summary>/// 连接到PLC/// </summary>public async Task<bool> ConnectAsync(){try{await _client.ConnectAsync(IpAddress, Port);_stream = _client.GetStream();Console.WriteLine(" PLC连接成功!");return true;}catch (Exception ex){Console.WriteLine($" PLC连接失败: {ex.Message}");return false;}}/// <summary>/// 断开连接/// </summary>public void Disconnect(){_stream?.Close();_client?.Close();Console.WriteLine("🔌 PLC已断开连接");}/// <summary>/// 发送命令并接收响应/// </summary>private async Task<string> SendAndReceiveAsync(string command){// 1. 计算校验码 (FCS)string fcs = CalculateFcs(command);// 2. 组装完整报文: @ + 命令 + FCS + *CR (回车符)string fullCommand = $"@{command}{fcs}\x0D"; byte[] sendBytes = Encoding.ASCII.GetBytes(fullCommand);// 3. 发送数据await _stream.WriteAsync(sendBytes, 0, sendBytes.Length);// 4. 接收数据byte[] buffer = new byte[1024];// 根据实际网络情况,可能需要循环读取,这里简化为单次读取int bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length);string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);return response;}/// <summary>/// 读取DM区数据 (例如读取 D100 开始的 10 个字)/// </summary>/// <param name="startAddress">起始地址 (如 100)</param>/// <param name="readCount">读取数量 (字数)</param>public async Task<short[]> ReadDmAreaAsync(int startAddress, int readCount){/** HostLink 读内存命令格式示例 (读取 D100 - D109):* 单元号 命令 存储区代码 起始地址 数量* 00    RD   82        000100   0010*/string command = $"00RD82{startAddress:D6}{readCount:D4}";string response = await SendAndReceiveAsync(command);// 解析响应报文if (response.Contains("OK")) {// 提取数据部分 (去除头部 @00RD82 和尾部 FCS/*CR)// 实际解析需根据具体的响应格式微调截取位置string dataStr = response.Substring(8, readCount * 4); short[] values = new short[readCount];for (int i = 0; i < readCount; i++){string hexValue = dataStr.Substring(i * 4, 4);values[i] = Convert.ToInt16(hexValue, 16); // Hex转Short}return values;}else{throw new Exception($"读取失败,PLC返回: {response}");}}/// <summary>/// 写入DM区数据/// </summary>public async Task<bool> WriteDmAreaAsync(int startAddress, short[] values){/** HostLink 写内存命令格式示例 (写入 D100=1234, D101=5678):* 00 WD 82 000100 0002 1234 5678*/StringBuilder sb = new StringBuilder();sb.Append($"00WD82{startAddress:D6}{values.Length:D4}");foreach (var val in values){sb.Append($"{val:X4}"); // 转成4位16进制大写字符串}string response = await SendAndReceiveAsync(sb.ToString());// 检查响应是否包含 "OK"return response.Contains("OK");}/// <summary>/// 计算校验码 (FCS: Frame Check Sequence)/// HostLink协议规定对 '@' 和 'CR' 之间的字符进行异或运算/// </summary>private string CalculateFcs(string data){byte fcs = 0;foreach (char c in data){fcs ^= (byte)c;}return fcs.ToString("X2"); // 转为两位十六进制大写字符串}public void Dispose(){Disconnect();_client?.Dispose();}}
}

二、 控制台测试程序 (Program.cs)

展示如何在主程序中调用上述类进行实际的 PLC 数据读写。

using System;
using System.Threading.Tasks;namespace HostLinkDemo
{class Program{static async Task Main(string[] args){Console.WriteLine("====== Omron HostLink (FINS/TCP) 通讯测试 ======");// 1. 创建HostLink实例 (填入PLC的实际IP和端口)// 注意:HostLink over TCP 的默认端口通常是 9600 或 8501,具体看PLC网络配置using var plc = new OmronHostLink("192.168.1.100", 9600); // 2. 建立连接bool isConnected = await plc.ConnectAsync();if (!isConnected) return;try{// 3. 写入数据测试 (向 D100, D101 写入数据)Console.WriteLine("\n[测试] 向 D100-D101 写入数据...");short[] writeData = { 1234, 5678 };bool writeResult = await plc.WriteDmAreaAsync(100, writeData);Console.WriteLine(writeResult ? " 写入成功!" : " 写入失败!");// 4. 读取数据测试 (从 D100 开始读取 5 个字)Console.WriteLine("\n[测试] 从 D100 开始读取 5 个字...");short[] readData = await plc.ReadDmAreaAsync(100, 5);Console.WriteLine(" 读取成功! 数据如下:");for (int i = 0; i < readData.Length; i++){Console.WriteLine($"D{100 + i}: {readData[i]} (0x{readData[i]:X4})");}}catch (Exception ex){Console.WriteLine($"\n 发生异常: {ex.Message}");}finally{// 5. 断开连接plc.Disconnect();Console.WriteLine("\n测试完毕,按任意键退出.");Console.ReadKey();}}}
}

参考代码 C# PLC通讯示例源码(hostlink) www.youwenfan.com/contentcnu/62391.html

三、 知识点解析

  1. 报文格式差异
    • 上述代码采用的是 Omron HostLink (ASCII) 模式
    • 如果是其他品牌的 PLC(如三菱、西门子)或者 Omron 的二进制模式,报文的帧头和帧尾会完全不同。如果是二进制模式,发送和接收都需要按 byte[] 处理,而不是 Encoding.ASCII
  2. 网络端口 (Port)
    • 传统的 HostLink 是基于 RS-232/485 串口转 TCP 的,端口常为 9600
    • 如果 PLC 配置的是 FINS/TCP 原生协议,默认端口通常是 9600(部分老型号是 8501)。请在 PLC 的网络设置中确认端口号。
  3. 存储区代码
    • 代码中读写的 DM区 对应的区域代码是 82(十六进制)。
    • 如果您需要读写 CIO、WR、HR 等其他区域,需要替换命令中的区域代码(例如 CIO 是 30)。
  4. 异步与多线程
    • 在实际的窗体应用(WinForms/WPF)或 Web API 中,绝对不要使用阻塞式的 .Result.Wait() 调用异步方法,否则极易导致 UI 卡死或线程死锁。请全程保持 async/await 的调用链。
http://www.jsqmd.com/news/796698/

相关文章:

  • 2026年汽车线束波纹管定制深度选购指南:昶力管业与高分子材料定制化解决方案 - 精选优质企业推荐官
  • STM32F070实战:用CubeMX搞定电容触摸屏的I2C转USB HID(附完整报告描述符解析)
  • OpenVSP参数化飞机设计完整教程:从零开始快速构建专业航空模型
  • 安平县美宏丝网制品有限公司:河道护栏全场景解决方案服务商 - 奔跑123
  • Hitboxer终极指南:3分钟解决游戏按键冲突,让你的键盘操作瞬间职业化
  • 明日方舟基建自动化:解放双手的智能管理方案
  • 明日方舟基建自动化管理终极指南:3步实现高效资源产出
  • 2026最新自热火锅_自热食品_冲泡速食_方便食品_懒人食品品牌推荐!国内优质品牌权威榜单发布,品类丰富实力可靠值得选择 - 十大品牌榜
  • 3步轻松解决Windows无法打开苹果照片的终极方案:HEIF Utility完全指南
  • 2026连云港干洗店大起底:本地权威测评排名全解析 - 速递信息
  • 2026年常州热缩管源头厂家深度选购指南:昶力管业与新能源汽车线束防护解决方案对标 - 精选优质企业推荐官
  • 官方认证|2026年国内五大正规明星代言 / 明星经纪服务公司排名,深圳星旺文化传媒有限公司综合实力遥遥领先,广东深圳等地 - 十大品牌榜
  • 夜莺传说服务器联机开服教程
  • 我的世界手机版烦人的村民整合包下载基岩国际版2026最新版
  • 5分钟搞定B站视频下载:从大会员4K到批量处理全攻略
  • 2026年5月北京昌平区代理记账公司哪家好?八大公司注册代办财税公司服务优选推荐 - 品牌智鉴榜
  • 2026南昌婚纱照深度测评|TOP5口碑机构横评 品质与性价比全解析 - charlieruizvin
  • 别再自己写轮子了!用Modbus Poll和Modbus Slave快速搞定工业协议调试(附详细配置截图)
  • 话费卡回收常见问题解析:闲置原因与回收方法 - 团团收购物卡回收
  • 5分钟掌握AI图层分离:让复杂插画秒变可编辑PSD
  • 终极免费音乐解锁工具:3步教你解锁加密音乐文件
  • Linux服务器内存告急?别慌,揪出那个叫xorg的‘内存大户’并优雅释放
  • 2026年常州热缩管源头厂家深度横评:新能源汽车线束防护、轨道交通阻燃方案与工业级定制全解析 - 精选优质企业推荐官
  • 2026年湖南断桥铝门窗与系统阳光房选购指南:隔音防水防潮全解析 - 年度推荐企业名录
  • ZYNQ 架构解析:从PS到PL的异构计算资源全景
  • 2026年常州耐高温热缩管厂家直供指南:昶力管业与高分子材料定制化解决方案深度横评 - 精选优质企业推荐官
  • 从“班委竞选”到“广告投放”:聊聊CCPC真题里那些有趣的模拟与贪心思路
  • 计算机领域 One-shot 是什么意思
  • 清华PPT模板终极指南:告别PPT设计烦恼,轻松制作专业演示
  • 2026一起聊聊微商城做的比较好的商家 - FaiscoJeff