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

概述

这是一个专为欧姆龙PLC设计的C#通信库,实现了基于FINS协议的以太网TCP通信功能。该库提供了完整的通信框架,支持多种内存区域的读写操作,能够方便地与欧姆龙PLC进行数据交换。

核心架构设计

1. 分层架构设计

库采用清晰的三层架构:

传输层 (Transport Layer):负责底层的TCP socket通信

  • tcpTransport:TCP传输实现
  • udpTransport:UDP传输实现(备用)
  • ITransport:统一的传输层接口

命令层 (Command Layer):处理FINS协议命令

  • tcpFINSCommand:FINS命令的封装和解析
  • IFINSCommand:命令层接口定义

应用层 (Application Layer):提供用户友好的API

  • OmronPLC:主要的PLC操作类

2. 字节处理工具

BTool静态类提供了丰富的字节转换和位操作功能:

// 数据类型转换
UInt16toBytes()    // UInt16转字节数组
BytesToUInt16()    // 字节数组转UInt16
Int16toBytes()     // Int16转字节数组
BytesToInt16()     // 字节数组转Int16

// 位操作
IsBitSet()         // 检查特定位是否设置
SetBit()           // 设置特定位
UnsetBit()         // 清除特定位
ToggleBit()        // 切换特定位状态

3. 内存区域支持

库支持欧姆龙PLC的多种内存区域:

  • CIO区域:输入输出区
  • WR区域:工作区
  • HR区域:保持区
  • AR区域:辅助区
  • DM区域:数据存储器
  • TIM/CNT:定时器/计数器

核心功能实现

1. 连接管理

通信库通过FINS协议的节点地址数据发送(NADS)建立连接:

public bool NodeAddressDataSend()
{
    // 发送NADS命令获取客户端和服务器节点地址
    // 建立通信会话
}

2. FINS命令帧结构

库实现了完整的FINS帧封装:

  • 帧头:包含FINS标识和长度信息
  • 命令头:包含ICF、RSC、GTC等控制字段
  • 地址信息:源/目标网络地址和节点号
  • 命令体:具体的内存操作指令

3. 主要通信命令

内存区域读取 (Memory Area Read)
bool MemoryAreaRead(MemoryArea area, UInt16 address, 
                   Byte bit_position, UInt16 count)
内存区域写入 (Memory Area Write)
bool MemoryAreaWrite(MemoryArea area, UInt16 address, 
                    Byte bit_position, UInt16 count, ref Byte[] data)
控制器数据读取 (Connection Data Read)
bool ConnectionDataRead(Byte area)

高级功能特性

1. 数据块管理

DDM类支持将两个DM寄存器作为32位值管理:

  • 支持无符号32位整数(UInt32)
  • 支持有符号32位整数(Int32)
  • 自动处理高低字节顺序

2. 位级精确操作

支持对CIO和WR区域的位级别操作:

  • 读取单个位的状态
  • 设置或清除特定位
  • 支持位位置的精确指定

3. 批量操作支持

  • 连续读取多个DM寄存器
  • 批量清零DM区域
  • 高效的数据传输机制

使用示例

基本连接和操作

// 创建PLC对象
var plc = new OmronPLC(TransportType.Tcp);

// 设置连接参数
var tcpCommand = (tcpFINSCommand)plc.FinsCommand;
tcpCommand.SetTCPParams(IPAddress.Parse("192.168.1.100"), 9600);

// 建立连接
if (plc.Connect())
{
    // 读取DM寄存器
    UInt16 value;
    if (plc.ReadDM(100, ref value))
    {
        Console.WriteLine($"DM100的值: {value}");
    }
    
    // 写入DM寄存器
    plc.WriteDM(100, 1234);
    
    // 读取CIO位状态
    Byte bitValue;
    plc.ReadCIOBit(10, 3, ref bitValue);
}

错误处理机制

库提供完善的错误处理:

  • 连接状态监控
  • 详细的错误信息返回
  • 通信超时处理
  • 协议错误代码解析

技术特点

1. 协议完整性

  • 完整的FINS/TCP协议实现
  • 正确的字节序处理
  • 完整的错误代码映射

2. 性能优化

  • 数据包合并发送(2022-12-03优化)
  • 缓冲区复用
  • 同步通信模式

3. 可扩展性

  • 接口驱动的设计
  • 易于添加新的FINS命令
  • 支持多种传输协议

4. 调试支持

  • 完整的通信日志记录
  • 详细的错误跟踪
  • 数据包十六进制转储

应用场景

该通信库适用于:

  • 工业自动化控制系统
  • 数据采集与监控系统(SCADA)
  • 设备状态监控
  • 生产过程数据记录
  • 远程设备控制

通过这个精心设计的通信库,开发者可以快速、可靠地与欧姆龙PLC建立通信,实现各种工业自动化应用的数据交换和控制功能。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐