ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NJ501无协议串口通信发送:Sysmac Studio配置与工程实践

NJ501无协议串口通信发送:Sysmac Studio配置与工程实践 开头先说一个很多工程师问过我的问题现场有一台欧姆龙 NJ501想要把一串数据发给扫码枪、电子秤、打印机或者视觉控制器很多人第一反应是“加一块串口服务器”或者“让上位机转发”其实 NJ501 自己就可以通过 RS-232C 口做无协议串口通信发送。所谓“无协议”就是不跑 Host Link、不跑 Modbus-RTU而是把 PLC 当成一个普通的串口设备按对方设备要求的帧格式直接发字节。为什么这个话题值得单独写一篇因为 NJ501 和 CP 系列或者 CJ 系列在串口配置思路上有区别。CP 系列很多机型自带串口用户直接在 CX-Programmer 里配置“无协议”模式然后调用 TXD 指令就能发送而 NJ 系列使用 Sysmac Studio变量、指令、参数组织方式都不同。视频里看着只是“发一串数据就结束了”但最容易出问题的往往不是最后那一条发送指令而是前面串口模式配置、端口选择、字节长度和触发方式。这篇文章会从概念开始逐步拆解 NJ501 无协议串口通信的完整发送流程同时给出工程中可以复用的变量声明思路、验证方法和排错清单。读完你至少能解决三件事搞清楚 NJ501 要发数据时到底该选哪种通信方式在 Sysmac Studio 里完成无协议模式配置独立完成一个“按一下按钮PLC 向串口设备发送固定字节”的最小工程并且会用上位机串口调试工具确认数据真的发出去了。1. 这篇文章真正要解决的问题先别急着看参数配置要理解 NJ501 做无协议串口通信发送首先要回答一个问题什么时候需要无协议很多现场设备并不是标准 Modbus 设备它只要求在特定管脚上收到一段 ASCII 字符串比如打印机需要接收HEAD1,123,456,END\r\n扫码枪支持的触发指令可能是由厂家文档定义的一串十六进制字节。对于这种非标、私有、一帧只有几个字节的场景用标准化协议反而不方便。无协议通信的价值就在这里PLC 完全按应用层需求组织报文不受协议约束。这篇文章最想解决的问题就是帮大家打通“NJ501 发送文字/字节数据到第三方串口设备”的完整链路。很多刚开始接触 Sysmac Studio 的工程师可能已经把功能块拖出来了但不知道串口参数在哪设置也不知道为什么下载程序以后设备没反应。实际上这类问题通常并不是程序写错而是串口配置和物理链路没对上。另一个容易踩的坑是设备选型。NJ501 不是所有型号都有内置 RS-232C 口如果 CPU 本身没有串口就必须依赖 CJ 系列串行通信单元或者 NX 系列串行通信单元。文章后面会对比这两种做法避免你花了很多时间写程序最后发现硬件上根本没有可用串口。2. 无协议串口通信的核心概念与适用场景2.1 什么是无协议串口通信无协议串口通信英文通常叫 Non-procedure Communication也有资料叫“无顺序通信”。它的本质含义是通信双方只约定物理串口参数比如波特率、数据位、停止位、校验位不约定业务层协议。发送方把待发送的一串十六进制字节或者 ASCII 字符丢给串口接收方按字节接收双方能不能理解内容由上一层业务程序决定。这句话很关键无协议不等于没有帧格式。帧格式是 PLC 发给设备时程序通过拼接数据自己规定的。比如你要发一个01READ\r\n给扫码枪那01READ\r\n这个结构就是业务协议它需要你在 PLC 程序中手工拼出来。2.2 无协议与 Host Link、Modbus 的区别很多初学者会把无协议和 Host Link 混淆因为欧姆龙编程口默认的串口通信往往是 Host Link 模式。Host Link 是欧姆龙上位机链接协议帧格式固定用于上位机与 PLC 之间的指令交互。无协议通信则完全不关心帧是否是欧姆龙协议它可以向任意第三方的串口设备发送任意字节。对比关系如下通信方式是否走欧姆龙协议是否需要双方帧格式一致适合场景Host Link是需要欧姆龙触摸屏、上位机组态软件与 PLC 通信Modbus-RTU是标准现场总线需要仪表、变频器、温控器等标准 Modbus 从站无协议否不需要按设备自定义帧扫码枪、打印机、视觉设备、单片机设备协议宏部分封装需要按宏配置CJ 串行通信单元灵活但配置复杂无协议最大的价值就是“中间没有翻译层”。只要串口参数一致NJ501 就能把字节直接发送到设备上。这也是现场调试时最常用的通信方式。2.3 发送数据在 NJ 中的处理路径从 NJ501 内部看程序里的发送数据通常不是直接写到串口芯片的。Sysmac Studio 中用户程序将待发送数据先放到一个字节数组或者字符串变量中然后调用串口发送功能数据进入 CPU 串口发送缓冲区再由 RS-232C 物理层逐字节发出去。由于这个路径里包含缓冲区程序执行指令成功只代表“数据进入缓冲区成功”并不代表对方设备已经收到。排查无协议通信问题时必须先区分“PLC 侧发送完成”和“设备侧收到正确报文”是两件事。3. 无协议串口通信的硬件接线与前置条件3.1 硬件资源怎么选如果你想用 NJ501 CPU 自带串口请先确认 CPU 型号。常见型号中NJ501-1400、NJ501-1500 这类带串口资源但也并不是所有 NJ501 型号都一定有 RS-232C 口采购时请以对应型号的硬件手册为准。如果 CPU 上没有串口或者现场串口数量不够常见方案有两个使用 CJ 系列串行通信单元例如配置在 NJ 扩展机架中的 CJ1W-SCU 系列模块。使用 NX1P2/NX 系列或第三方串口扩展模块。不同方案在 Sysmac Studio 里的配置入口不同但无协议通信的参数本质是一样的。对初学者我建议先用带内置 RS-232C CPU 的型号练习减少硬件组合层次。3.2 RS-232C 接线注意事项无协议发送常见物理接口是 RS-232C。绝大多数情况下PLC 串口和 PC 调试口的连接需要交叉接线。PLC 的发送数据针脚要接 PC 的接收数据针脚PLC 的接收针脚要接 PC 的发送数据针脚地线要共地。DB9 公头母头也很容易接反。调试时建议使用成品 USB 转 RS-232C 线或者串口调试助手配套线缆不要上来就自己做线。如果是现场临时飞线发送引脚接反是第一位要排除的问题。3.3 软件环境准备本文章节演示基于 Sysmac Studio。由于版本变化菜单名称可能略有差异原则是“以你当前工程实际界面为准”。建议准备以下环境欧姆龙 NJ501 CPU 一台确认包含串口资源。Sysmac Studio 软件一套版本尽量与 PLC 固件匹配。USB 或 Ethernet 通信线缆用于连接 PLC。一根 RS-232C 串口线。PC 端串口调试助手工具用于验证数据是否发出来。如果你的串口调试助手使用电脑 COM 口则需要 USB 转 RS-232C 转换线并安装对应驱动。从经验看练手阶段用虚拟串口工具也能演示部分逻辑但不能代替真实硬件验证。无协议通信最终必须以真实串口波形或真实接收设备为准。4. Sysmac Studio 中的无协议串口配置4.1 新建工程并选择 CPU 型号用 Sysmac Studio 新建工程选择 NJ 系列对应 CPU 型号。创建工程后不要急着写程序先检查控制器设置。NJ501 无协议串口通信需要在 Sysmac Studio 的“配置和设置”中找到 CPU 的串口资源并把它设置为无协议模式。CPU 自带串口和扩展串行单元在“配置和设置”里的层级不同但参数类型相近。在离线状态下一般路径是项目树中的“配置和设置” - CPU/单元 的串口设置双击后打开设置窗口。对于 CPU 自带串口通常能看到通信模式下拉框可能包含“Host Link”“无协议”“NT Link”等选项。选择“无协议”而不是 Host Link这是最容易忽略的第一步。4.2 串口参数配置无协议模式下需要确认以下参数参数项常见设置说明通信模式无协议一定要选无协议而不是 Host Link波特率9600 / 115200必须与设备端一致数据位8大部分串口设备是 8 位停止位1 或 2按设备手册校验方式无校验多数简单设备无校验复杂项目按需流控无如果设备需要硬件流控则要接对应信号线串口响应超时视通信周期设置如果只是发送影响往往不大串口两侧参数必须完全一致否则接收端收到的是乱码。由于视频中通常不会逐项展开说明很多学员在线下载工程后只改波特率忘记确认停止位和校验位这是乱码的常见原因。4.3 使用扩展串行单元时的配置差异如果使用 CJ 系列串行通信单元除了波特率、数据位、停止位、校验位外还需要在 IO 配置中确认单元号、占用 CIO 字地址和 DM 字地址。扩展串行单元在每个扫描周期会由 CPU 刷新输入输出数据。此时无协议发送程序需要访问的不再是“CPU 内置串口”而是“扩展单元的串口”。体现在指令参数或功能块参数上通常要指定单元地址或端口号。项目现场如果重启后设备仍然无法通信先检查扩展单元地址分配是否被后续 IO 配置覆盖。5. NJ501 无协议串口通信发送程序实现5.1 无协议发送的最小流程无协议发送在程序侧的任务就是组织数据、触发发送、检测完成、异常复位。不管具体指令形式是什么这个逻辑都成立。最稳妥的实践方式是建立一片字节数组变量作为发送缓冲区然后按设备协议往数组里填数据。对于固定报文场景直接在初始化或触发条件中用常量赋值对于动态拼接场景再把设备命令变量填入数组。5.2 关键变量定义在 Sysmac Studio 中打开全局变量表或者程序局部变量表建立以下变量// 发送触发信号上升沿触发一次 bSendTrigger AT %Q0.0 : BOOL : FALSE; // 发送完成标志 bSendDone : BOOL : FALSE; // 发送错误标志 bSendError : BOOL : FALSE; // 发送错误代码 wSendErrorID : WORD : 16#0000; // 待发送数据缓冲区最多 32 字节可根据设备报文调整 arySendData : ARRAY[0..31] OF BYTE : [16#40,16#30,16#31,16#52,16#45,16#41,16#44,16#0D,16#0A]; // 实际发送字节数根据当前报文计算 nSendLength : INT : 9;这里把发送数据定义成BYTE数组而不是字符串原因是串口设备协议中经常包含十六进制控制字符例如0D 0A回车换行、0A换行字符串变量在这种场景下不方便表达。变量表设置中的AT %Q0.0可以根据实际按钮输入点替换。如果只做测试也可以直接用内部变量再人为触发。5.3 触发逻辑与发送调用由于无协议发送是异步过程建议不要让发送条件一直为 ON。如果程序周期性地给串口发送指令可能会导致对方设备收到一堆重复报文。触发信号最好使用上升沿保证一次按钮操作只发送一次。在 Sysmac Studio 的 ST 程序中可以按下面的思路组织代码// 上升沿检测bSendTrigger 从 FALSE 变为 TRUE 时bSendRise 产生一个扫描周期脉冲 bSendRise : bSendTrigger AND NOT bSendRiseOld; bSendRiseOld : bSendTrigger; IF bSendRise THEN // 新一次发送请求先清除上次的完成标志和错误标志 bSendDone : FALSE; bSendError : FALSE; // 调用串口发送功能不同版本的功能块名称和操作数可能有差异。 // 这里的关键是传入数据缓冲区、实际发送字节数、串口资源标识。 SerialSend_1( Execute : TRUE, Data : arySendData, Length : nSendLength, Done bSendDone, Error bSendError, ErrorID wSendErrorID ); END_IF; // 如果本次发送已经完成或者发送失败将 Execute 拉低避免重复触发 IF bSendDone OR bSendError THEN SerialSend_1(Execute : FALSE); END_IF;上面代码中的SerialSend_1是串口发送功能块的示例名称。为什么这里不直接贴一个万能的 Sysmac 指令因为 NJ 的无协议串口通信实现根据 CPU 型号、扩展单元类型和 Sysmac Studio 版本差异具体功能块名称有所区别。工程中建议以官方手册和 Sysmac 库中实际存在的串口发送功能块为准。但无论名称怎么变程序逻辑都是同样的上升沿触发、送缓冲区、指定长度、等待完成或错误。如果你用的是 CJ 系列兼容指令TXD也要注意类似问题。欧姆龙传统 PLC 的TXD指令依赖 CPU 总线单元地址和控制字从 NJ501 程序里调用时要对控制字中的端口/单元地址按照手册填好。控制字最容易填错不是把“发送字节数”写到控制字高位就是漏掉了端口编号。5.4 动态拼接报文示例有些设备发送的数据不是固定常量而是需要把当前日期、重量值、数量值拼进报文里。此时不要直接修改整段数组更好的做法是先定义一个字节数组模板再按位置覆盖。// 将 INT 类型变量中的低字节填入发送数组指定位置 nWeightValue : INT : 1234; // 将不同字节分别放入发送缓冲区例如第 5 字节放高字节第 6 字节放低字节 arySendData[5] : BYTE_TO_BYTE(SHR(INT_TO_WORD(nWeightValue), 8) AND 16#00FF); arySendData[6] : BYTE_TO_BYTE(INT_TO_WORD(nWeightValue) AND 16#00FF);真实项目中若字节顺序高位在前还是低位在前必须看设备手册。许多串口仪器都支持“高字节在前”或“低字节在前”与 PLC 内部字的大端小端理解不同。如果数据装配错误接收方校验会一直失败而示波器看发送字节却看不出异常。6. 用上位机串口工具验证 NJ501 发送结果6.1 最小上位机验证逻辑现场没有真实设备时最简单的验证方式是让 NJ501 的串口接入 PC 的 COM 口然后用串口调试助手查看数据。确认 PC 端能收到正确的 ASCII 或 HEX 数据再连接真实设备。我用 C# 写一个最小的串口监听程序用来确认 NJ501 发出来的字节是什么using System; using System.IO.Ports; class SerialReceiveTest { static void Main() { SerialPort sp new SerialPort(COM3, 9600, Parity.None, 8, StopBits.One); sp.DataReceived (s, e) { SerialPort port (SerialPort)s; byte[] buffer new byte[port.BytesToRead]; port.Read(buffer, 0, buffer.Length); Console.WriteLine(BitConverter.ToString(buffer).Replace(-, )); }; sp.Open(); Console.WriteLine(串口已打开按任意键退出); Console.ReadKey(); sp.Close(); } }这个程序只打印十六进制字节不处理业务逻辑。用它验证 PLC 发送时如果 NJ501 发了40 30 31 52 45 41 44 0D 0APC 端会直接显示相同数组。如果显示3F 3F或随机字符很大概率不是程序问题而是串口参数不一致。6.2 如何判断发送成功判断发送成功需要分开两个层面第一层是 PLC 程序侧发送功能块上报Done或Error。如果ErrorID有值程序没有成功把数据送入串口发送缓冲区此时先查看错误代码并按错误代码查询手册。第二层是接收设备是否收到正确数据。无协议通信发送成功不等于设备执行正确。设备收到后如果反馈错误优先检查设备协议里要求的帧头、长度、校验位。从调试经验看建议在 NJ501 中加一个“发送次数计数器”变量。每次成功发送后计数器加 1然后在上位机或触摸屏查看这个计数器。这样即使串口接收侧没有回显也能判断 PLC 是否一直重复发送。7. NJ501 无协议串口通信常见问题与排查思路无协议通信问题定位时要按照“配置 - 物理接线 - 触发条件 - 数据格式 - 设备协议”的顺序排查不要一上来就改程序。下面是几个高频问题问题现象可能原因排查方式解决方案PLC 串口设置为无协议后设备无反应CPU 模块本身没有可用串口确认 CPU 型号手册查看 IO 配置改用带串口的 CPU 型号或增加串行通信单元收到乱码波特率、停止位、校验位不一致用串口助手和设备手册逐项对比统一串口参数后重新测试程序下载后没有数据发出串口模式仍然是 Host Link打开串口设置确认模式改为无协议模式并重新下载配置PLC 一个扫描周期发出多次重复数据发送触发信号长时间为 ON检查触发变量和上升沿逻辑使用上升沿触发发送发送完成后再复位只收到部分字节或字节缺失接收设备缓冲时间不够或发送长度不对对比 ararySendData 实际内容与 nSendLength确认发送长度与实际有效数据一致报文内容正确但设备不动作缺少帧尾校验字不对对照设备协议文档抓取报文补充帧尾、校验字节确认大小端7.1 触发了一次但发了两包数据如果按钮保持按下的时间超过了 PLC 扫描周期一个上升沿检测程序应该不会重复发送。但如果发送功能块的Execute一直为 TRUE 且发送功能块自身不支持内部沿检测就可能出现重复发送。建议把上升沿信号和功能块的Execute严格对应并在发送完成后强制Execute为 FALSE。7.2 串口参数改了但发送报文还是旧参数Sysmac Studio 的串口配置修改后并不是保存程序就能立刻生效。需要将控制器设置一并下载到 PLC。如果只是下载了程序而没有下载“配置和设置”PLC 会在复位或重启后恢复旧配置。下载后也建议让 PLC 重新上电或复位一次确保串口按新参数初始化。7.3 使用扩展串行单元后看不到成功标志扩展串行单元中的发送请求受到 CPU 与扩展单元 CIO 数据交换周期的影响。程序里发送完成标志可能稍有延迟这种延迟通常正常。如果长时间不完成先检查单元号、端口号是否与硬件设置一致再看单元是否处于运行状态。8. 工程中的最佳实践与上机建议8.1 数据报文尽量集中管理不要把报文里的功能码、寄存器地址、CRC 计算散落在各个程序段里。建议在一段初始化程序或者专用功能块中完成“组装报文”任务之后主流程只触发发送。这样设备协议变更时只需要改一处。// 推荐做法先填充一个完整报文再触发发送 arySendData[0] : 16#40; // 帧头 arySendData[1] : 16#30; // 设备地址 ASCII 0 arySendData[2] : 16#31; // 设备地址 ASCII 1 arySendData[3] : 16#52; // 命令 R arySendData[4] : 16#45; // E arySendData[5] : 16#41; // A arySendData[6] : 16#44; // D arySendData[7] : 16#0D; // 回车 arySendData[8] : 16#0A; // 换行 nSendLength : 9;如果设备采用 ASCII 码报文建议直接对照 ASCII 码表写注释。时间久了只看到16#52可能很难想起是什么命令加上注释后后期维护会轻松不少。8.2 用功能块封装无协议发送逻辑如果项目中有很多地方需要发送报警、状态、配方等不同报文不要在每个位置单独写发送指令。可以做一个统一的FB_SerialSend对外只暴露 Trigger、Data、Length、Done、Error 接口内部管理发送完成标志和错误状态。这样可以避免不同程序块里触发变量冲突。从 NJ501 工程来看串口发送指令通常是异步的。功能块封装时要注意前一帧还没有发送完成时来了新请求怎么处理最简单且安全的方式是当前一帧Done或Error没有返回前拒绝接收新请求并用“Busy”输出量通知调用方。8.3 无协议通信没有 CRC 保护时应用层要加校验无协议只解决“把字节发出去”的问题不解决“字节是否被篡改”的问题。如果通信距离长或现场干扰大建议在应用层加入和校验、CRC 校验或重复帧序号。简单的和校验可以这样计算nCheckSum : BYTE : 16#00; // 对有效数据区做异或或累加具体方式按设备协议 FOR i : 0 TO nSendLength - 2 BY 1 DO nCheckSum : nCheckSum XOR arySendData[i]; END_FOR; arySendData[nSendLength - 1] : nCheckSum;注意在无协议通信中增加任意一个校验字节发送方和接收方必须同步修改协议。如果设备是只能接收固定长度的闭环系统加校验反而会造成设备解析错误。8.4 生产环境变更必须验证并备份如果无协议串口通信用于产线设备控制修改配置和程序前要先备份原工程尽量离线仿真或停机验证。不要在生产模式中直接修改串口参数后马上测试。无协议通信没有标准握手机制一旦参数改动错误设备端可能持续报错恢复时需要重新下装配置并重启这会直接影响生产节奏。现场遇到问题需要更换串口线或模块时遵循最小权限原则只让具备权限的维护人员操作并记录 COM 口、接线、波特率等变更信息。9. 总结先跑通固定报文再做动态帧NJ501 无协议串口通信发送难点并不在于“调用发送指令”本身而在于理解无协议的本质PLC 就是按字节发送业务帧和校验都由自己负责。只要把串口资源选对、通信模式配成无协议、接线交叉正确、触发逻辑上升沿处理到位一个最小发送工程很快可以跑通。建议第一次动手时先不要接真实设备直接让 NJ501 向串口调试助手发送01READ\r\n这个固定报文。等 PC 端能稳定收到对应十六进制数据后再逐步改成动态拼接报文加入校验字节最后连接真实扫码枪或打印机。这篇文章能帮你解决到哪一步你可以在 Sysmac Studio 中完成无协议模式配置能看懂发送缓冲区、发送长度、触发时机的作用也能用串口工具验证 PLC 是否发出正确字节。继续深入的方向包括接收端的RXD指令、ASCII 与 HEX 混合装配、和校验/CRC 计算、串口通信功能块的时序管理以及 NJ501 与扫码枪的完整交互案例。建议先收藏这篇文章等你在工程中实际配置到对应步骤时再对照排错。
返回列表