导读:本期聚焦于小伙伴创作的《C#如何与欧姆龙PLC通讯_C#与欧姆龙PLC通讯完整教程与代码实例》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何与欧姆龙PLC通讯_C#与欧姆龙PLC通讯完整教程与代码实例》有用,将其分享出去将是对创作者最好的鼓励。

C#与欧姆龙PLC通讯是工业自动化上位机开发中的常见需求。欧姆龙PLC支持多种通讯协议,最常用的是基于以太网的FINS协议和基于串口的Host Link协议。本文将以C#语言为核心,结合开源且成熟的HslCommunication库,演示如何通过这两种方式与欧姆龙PLC进行数据交互。无论你使用的是CP1H、CJ2M还是NJ系列PLC,本文的方法均能适配,只需调整参数即可。

准备工作与库安装

在开始编码之前,确保你的开发环境包含以下条件:

  • Windows操作系统 + Visual Studio 2019或更高版本
  • 项目类型:控制台应用程序或WinForms/WPF均可
  • 目标框架:.NET Framework 4.6.1或.NET Core 3.1以上

然后通过NuGet安装HslCommunication库。在包管理器控制台中执行:

Install-Package HslCommunication

或者通过图形界面搜索并安装“HslCommunication”,建议使用最新稳定版本。该库支持欧姆龙PLC的FINS UDP、FINS TCP以及Host Link等协议,我们后续将分别演示。

使用FINS UDP与欧姆龙PLC通讯

FINS(Factory Interface Network Service)是欧姆龙定义的工业网络协议,可运行在UDP或TCP之上。UDP方式因效率较高,在局域网中广泛应用。下面演示如何通过FINS UDP连接PLC并读写D区数据。

连接与读写示例

using HslCommunication.Profinet.Omron;
using System;

namespace OmronPLC_Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建FINS UDP连接对象,参数为PLC的IP地址和端口号(默认9600)
            OmronFinsUdp plc = new OmronFinsUdp("192.168.0.10", 9600);
            plc.ConnectTimeOut = 2000; // 设置连接超时2秒

            // 建立连接
            var connectResult = plc.ConnectServer();
            if (connectResult.IsSuccess)
            {
                Console.WriteLine("连接成功");
                
                // 读取D100开始的5个字(16位整数)
                var readResult = plc.ReadInt16("D100", 5);
                if (readResult.IsSuccess)
                {
                    Console.WriteLine("读取成功,数据:");
                    foreach (var val in readResult.Content)
                    {
                        Console.Write(val + " ");
                    }
                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine("读取失败:" + readResult.Message);
                }

                // 向D200写入一个整数值1234
                var writeResult = plc.Write("D200", (short)1234);
                if (writeResult.IsSuccess)
                {
                    Console.WriteLine("写入成功");
                }
                else
                {
                    Console.WriteLine("写入失败:" + writeResult.Message);
                }

                // 关闭连接
                plc.ConnectClose();
            }
            else
            {
                Console.WriteLine("连接失败:" + connectResult.Message);
            }
        }
    }
}

上述代码中,IP地址192.168.0.10需要替换为你PLC的实际IP。欧姆龙PLC默认FINS端口为9600,若不修改则保持默认。读取地址D100表示从数据存储器D100开始,连续读取5个16位整数。写入时直接使用Write方法并传入对应数据类型即可。

读取其他数据类型

HslCommunication支持多种数据类型,例如浮点数、布尔、字符串等。读取实数时需注意字节顺序。以下示例读取W区(工作区)的布尔位:

// 读取W0.00位(即W0的第0位)
var bitResult = plc.ReadBool("W0.00");
if (bitResult.IsSuccess)
{
    Console.WriteLine("W0.00状态:" + (bitResult.Content ? "ON" : "OFF"));
}

使用Host Link协议(串口通讯)

当以太网不可用时,许多欧姆龙PLC也支持通过串口(RS232/RS485)使用Host Link命令通讯。HslCommunication同样提供了OmronHostLink类。首先需要设置正确的串口参数,例如波特率、数据位等。

串口连接与读写

using HslCommunication.Profinet.Omron;
using System.IO.Ports;

// 创建串口对象
SerialPort sp = new SerialPort("COM3", 9600, Parity.Even, 7, StopBits.Two);
// 注意:欧姆龙Host Link通常使用Even奇偶校验、7数据位、2停止位

// 创建Host Link实例
OmronHostLink hostLink = new OmronHostLink(sp);
hostLink.ConnectTimeOut = 2000;

// 执行连接(打开串口)
var openResult = hostLink.Open();
if (openResult.IsSuccess)
{
    Console.WriteLine("串口打开成功");
    // 读取C100区(计数器区)当前值
    var read = hostLink.Read("C100", 1);
    if (read.IsSuccess)
    {
        Console.WriteLine("计数器C100值:" + read.Content[0]);
    }
    // 写入D0
    hostLink.Write("D0", (short)888);
}
else
{
    Console.WriteLine("打开串口失败:" + openResult.Message);
}
hostLink.Close();

串口参数需与PLC侧设置完全一致。通常欧姆龙PLC的Host Link默认波特率为9600,数据位7,偶校验,2停止位。若使用RS485则可能需要额外处理地址。

常见问题与解决方案

问题现象可能原因解决办法
连接超时IP地址错误,或PLC未响应使用ping命令测试PLC可达性;检查PLC的FINS UDP配置是否开放
读取数据全为0或异常值数据类型不匹配,或字节顺序错误确认PLC中数据格式(16位/32位);尝试使用ReadInt32ReadFloat
写入无效地址不可写(如输入区)检查PLC地址范围,D区、W区、H区可写
串口通讯乱码波特率、校验位设置不一致核对PLC串口参数,重新配置

完整项目结构与最佳实践

在实际项目中,建议将PLC通讯封装为独立的类,便于维护和复用。例如创建一个PLCController类,初始化连接,提供读取、写入等公开方法。同时添加重连机制和异常日志记录。以下是一个简单的封装示例:

using HslCommunication.Profinet.Omron;

public class PLCController : IDisposable
{
    private OmronFinsUdp _plc;
    public PLCController(string ipAddress, int port = 9600)
    {
        _plc = new OmronFinsUdp(ipAddress, port);
        _plc.ConnectTimeOut = 3000;
    }

    public bool Connect()
    {
        var result = _plc.ConnectServer();
        return result.IsSuccess;
    }

    public short[] ReadDWords(int startAddress, int length)
    {
        var result = _plc.ReadInt16("D" + startAddress, length);
        return result.IsSuccess ? result.Content : throw new Exception(result.Message);
    }

    public bool WriteDWord(int address, short value)
    {
        var result = _plc.Write("D" + address, value);
        return result.IsSuccess;
    }

    public void Dispose()
    {
        _plc?.ConnectClose();
    }
}

使用该封装后,主程序只需:

using (var controller = new PLCController("192.168.0.10"))
{
    if (controller.Connect())
    {
        var data = controller.ReadDWords(100, 10);
        // 处理数据...
    }
}

总结

通过HslCommunication库,C#与欧姆龙PLC的通讯变得非常简单。文中分别介绍了基于FINS UDP的以太网方式和基于Host Link的串口方式,并给出了可直接运行的代码实例。在实际部署时,请根据PLC型号和网络环境选择合适协议,并注意设置正确的超时和错误处理。掌握了这些方法,你就能快速开发出稳定可靠的PLC上位机应用程序。

欧姆龙PLCC#FINS协议HslCommunication读写PLC数据修改时间:2026-06-08 16:24:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。