C# CIP通讯欧姆龙NX1P2通讯DEMO代码功能说明(基于原始代码逐段解读)

张开发
2026/4/6 20:28:02 15 分钟阅读

分享文章

C# CIP通讯欧姆龙NX1P2通讯DEMO代码功能说明(基于原始代码逐段解读)
C#编写CIP通讯源码欧姆龙NX1P通讯DEMO一、项目基础配置与环境说明一配置文件核心作用App.config与CIP_TEST.exe.config这两个配置文件功能一致仅存在于不同目录源码目录与编译输出目录核心作用是指定程序运行依赖的.NET框架版本为.NET Framework 4.8。通过节点明确运行时环境确保程序在兼容的框架下启动避免因版本不匹配导致的启动失败或功能异常。CIPTEST.csproj项目配置文件作为项目的核心编译配置文件主要承担以下职责- 定义项目基础属性指定输出类型为Windows窗体可执行程序WinExe根命名空间与程序集名称均为“CIPTEST”目标框架版本为.NET Framework 4.8- 区分编译模式Debug模式下生成完整调试符号、不优化代码便于开发调试Release模式下优化代码、仅保留必要调试文件提升运行效率- 管理引用与文件引入Windows Forms开发必需的组件如界面绘制、数据处理相关库关联核心代码文件如CipHelp.cs、Form1.cs并明确文件依赖关系确保编译流程正常执行。二项目文件结构与分工项目共包含15个文件按功能可分为四类配置类App.config、CIP_TEST.csproj等负责环境与编译配置核心功能类CipHelp.csCIP协议处理、PublicHandle.cs公共枚举定义实现通讯核心逻辑界面类Form1.cs界面逻辑、Form1.Designer.cs界面布局提供用户交互入口辅助类Program.cs程序入口、Properties目录下文件程序集信息、资源管理保障程序启动与基础信息管理。二、核心功能类CipHelp.csCIP协议处理该类是整个通讯Demo的核心封装了CIP协议从会话建立到数据解析的全流程命名空间为EntherNetIPCIP_所有逻辑均围绕“与欧姆龙NX1P2 PLC通讯”展开。一基础成员与数据映射设计事件定义定义三个事件实现跨类通信-SessionEvent会话注册成功后触发传递会话句柄信息用于通知界面更新会话状态-TagValueExchangeEvent标签值发生变化时触发传递标签名称、类型、值等信息用于界面日志展示-TagValueEvent预留事件当前版本未实际使用为后续功能扩展预留接口。标签映射字典设计三个字典实现标签的双向映射与值缓存解决多标签并发读写的标识问题-TagFlagTagValue以标签“随机标志”为键缓存标签当前值用于快速对比值是否变化-TagFlagTagStr以标签“随机标志”为键映射对应的标签名称用于解析响应时匹配标签-TagStr_TagFlag以标签名称为键映射对应的“随机标志”用于构造请求时标识标签。协议常量定义定义固定的CIP协议报文与字段-RegisterSession会话注册请求报文命令码0x65字节数组固定无需动态修改-UnregisterSession会话注销请求报文命令码0x66初始为固定结构后续需填充会话句柄- 其他固定字段如服务标识读取0x4C、写入0x4D、请求路径0x20 0x06 0x24 0x01、超时时间0x0A 0xF0等均遵循CIP协议与欧姆龙NX1P2的通讯规范。二辅助方法RandStr()功能是生成8位随机字符串字符集包含数字、大小写字母与特殊符号#*。生成逻辑基于当前时间戳作为随机数种子确保每次生成的字符串唯一。该随机字符串作为标签的“唯一标志”TagFlag用于在报文的“发送方描述”字段标识标签后续解析响应时通过该标志匹配对应的标签名称避免多标签并发读写时的混淆。三报文构造逻辑单标签读取报文GetCipRSingle_Tag()核心作用是根据输入的标签名称生成符合CIP协议的读取请求字节数组流程分为四步- 标签标志初始化若标签未生成“随机标志”调用RandStr()生成并建立标签名称与标志的双向映射- 标签编码处理将标签名称以UTF-8编码转为字节数组若字节数为奇数末尾补0x00满足CIP协议对偶数长度的要求- CIP核心报文构建依次添加服务标识0x4C读取、CIP长度按字计算、标签类型标识0x91、标签编码字节、读取长度1个元素形成CIP协议核心数据段- 完整报文封装组合帧头命令码0x6F、会话句柄、发送方描述等、特定命令数据接口句柄、超时时间等、CIP核心报文与槽号欧姆龙PLC固定路径参数最终生成可直接发送的TCP报文。单标签写入报文GetCipWSingle_Tag()功能是生成BOOL类型标签的写入请求报文流程与读取报文类似但存在两处关键差异- 服务标识改为0x4D表示“写入标签”- 核心报文段增加“写入类型”0xC1标识BOOL类型与“写入值”0x01为置位、0x00为复位字段根据输入的布尔值动态填充写入值确保写入逻辑正确。四数据解析逻辑响应分发RevmsgHandle()接收PLC返回的字节数组后根据报文首字节命令码分发处理逻辑- 命令码0x65对应会话注册响应调用GetSessionHandle()解析会话句柄- 命令码0x6F对应标签数据响应调用GetSingleTagVal()解析标签值- 其他命令码当前版本未处理直接忽略符合“聚焦欧姆龙NX1P2核心通讯”的设计意图。会话句柄解析Get_SessionHandle()解析会话注册响应报文流程为- 提取报文长度与状态码验证状态码是否为“成功”0x0000参考PublicHandle.cs中的枚举- 若成功从报文中提取会话句柄并赋值给SessionHandle成员同时填充UnregisterSession报文的会话句柄字段触发SessionEvent事件通知界面更新- 若失败根据状态码枚举显示错误信息如“无效会话句柄”“内存不足”便于问题排查。标签值解析GetSingleTagVal()解析标签数据响应报文确保数据有效性与正确性流程为- 报文有效性校验验证“帧头长度数据长度”是否与总长度匹配、会话句柄是否一致、会话状态是否正常若不满足则丢弃报文- 提取标签标志从“发送方描述”字段提取8位字符作为标签的“随机标志”匹配对应的标签名称- 数据类型解析根据报文中的“数据类型标识”如0x00C1为BOOL、0x00D1为Byte解析对应类型的标签值支持BOOL、Byte、int、long、real、string六种常用类型- 值变化判断对比缓存的标签值TagFlagTagValue若发生变化则更新缓存并触发TagValueExchangeEvent事件通知界面。三、界面交互类Form1.cs用户交互与流程控制该类基于Windows Forms开发提供完整的可视化操作界面所有逻辑均围绕“用户操作→通讯执行→结果展示”的流程展开是用户与PLC通讯的直接入口。一界面布局与功能分区界面通过Form1.Designer.cs定义布局分为四个核心功能区各区域分工明确连接参数区包含IP地址默认192.168.250.1、端口默认44818输入框以及“连接”“断开”“注册会话”按钮负责TCP连接与CIP会话管理标签操作区包含标签名称输入框、标签值显示框以及“读取当前标签”“添加当前标签”“自动读取所有标签”“置位/复位”按钮实现单标签读写与批量轮询控制标签列表区包含ListBox显示已添加标签与“仅显示选中项”按钮支持标签管理与单独监控日志展示区多行文本框显示标签值变化日志、操作日志如“标签添加成功”与时间戳便于用户追溯操作与通讯结果。二核心界面逻辑连接与会话管理- 连接button1Click创建TCP Socket连接用户输入的IP与端口连接成功后禁用“连接”按钮、启用“断开”与“注册会话”按钮确保操作流程正确- 断开button2Click关闭TCP连接重置会话句柄SessionHandle恢复按钮状态避免无效操作- 注册会话button3_Click发送RegisterSession报文从CipHelp类获取等待SessionEvent事件触发后在界面显示会话句柄完成会话建立。标签操作逻辑- 读取当前标签button4Click调用CipHelp类的GetCipRSingleTag()生成读取报文通过TCP发送给PLC等待响应后更新标签值显示框- 添加当前标签button5Click将输入的标签名称添加到本地轮询字典TagNameTag与ListBox避免重复添加同时在日志区显示“添加成功”信息- 自动读取所有标签button6Click通过AutoRead布尔值控制自动轮询的启动/停止启动时定时器间隔1ms按队列顺序发送所有已添加标签的读取请求实现批量监控- 置位/复位button9Click根据按钮当前文本“置位”/“复位”切换布尔值调用CipHelp类的GetCipWSingle_Tag()生成写入报文发送后切换按钮文本实现BOOL标签的状态控制。数据展示与监控- 标签值变化处理CipHelpTagValueExchangeEvent接收CipHelp类触发的事件根据selectswitch布尔值控制“仅显示选中项”功能决定日志显示范围——若开启则仅显示选中标签的变化否则显示所有标签变化同时添加时间戳确保日志时效性- 标签列表选中listBox1SelectedIndexChanged记录当前选中的标签名称用于“仅显示选中项”功能的过滤- 日志长度控制textBox6TextChanged当日志文本长度超过1000字符时清空文本框避免内存占用过高导致界面卡顿。三多线程与异步处理为避免界面卡顿程序采用“后台线程定时器”的多线程设计数据接收线程程序启动时创建后台线程IsBackground true循环监听TCP Socket的接收缓冲区收到数据后立即调用CipHelp类的RevmsgHandle()解析确保数据处理不阻塞界面自动轮询定时器使用System.Timers.Timer间隔1ms当AutoRead为true时按队列TagQueue顺序发送标签读取请求队列空时重新填充所有已添加标签实现有序轮询避免并发冲突。四、公共枚举类PublicHandle.cs该类仅定义一个枚举State_Code包含CIP通讯中常见的状态码如“成功”0x0000、“无效命令”0x0001、“内存不足”0x0002、“无效会话句柄”0x0064等。每个枚举值均附带中文注释明确状态含义主要用于CipHelp类解析响应时判断通讯状态以及在界面显示错误信息降低问题排查难度。五、程序入口与启动流程Program.cs该类是应用程序的入口仅包含Main方法启用Windows可视化样式Application.EnableVisualStyles()确保界面符合系统外观禁用兼容文本渲染Application.SetCompatibleTextRenderingDefault(false)避免文本显示异常启动主窗体Application.Run(new Form1())触发Form1的Load事件开启数据接收线程与定时器完成程序初始化。六、关键通讯流程与程序意图一完整通讯流程以读取标签为例用户在界面配置PLC的IP与端口默认192.168.250.1:44818点击“连接”按钮建立TCP连接点击“注册会话”按钮发送CIP会话注册请求PLC返回会话响应CipHelp类解析会话句柄并通知界面显示用户输入标签名称点击“读取当前标签”CipHelp类生成读取报文通过TCP发送给PLCPLC返回标签数据响应CipHelp类解析值并触发事件界面接收事件更新标签值显示框与日志完成一次读取流程。二程序设计意图从代码细节可明确该Demo的核心意图是“为欧姆龙NX1P2 PLC提供CIP通讯的基础参考”具体体现在三方面功能聚焦仅实现“会话管理单标签读写批量轮询”核心功能不冗余扩展确保逻辑清晰便于开发者理解协议合规所有报文构造与解析均遵循CIP协议规范且适配欧姆龙NX1P2的固定参数如槽号、请求路径确保通讯兼容性易用性提供直观的界面与操作说明button8_Click显示操作步骤降低使用门槛同时保留扩展空间如预留事件、可修改的轮询间隔便于开发者根据实际需求调整。C#编写CIP通讯源码欧姆龙NX1P通讯DEMO

更多文章