ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

欧姆龙NJ501无协议串口通信发送:从硬件配置到程序实现

2026/9/4 2:56:07 拓冰建站 浏览量
欧姆龙NJ501无协议串口通信发送:从硬件配置到程序实现 这次我们来看一个很具体的工业现场需求欧姆龙NJ501怎么把数据通过无协议串口通信发送出去。很多从CJ系列或CP1H转过来的工程师通常会先找一条类似TXD的指令但NJ501的编程环境已经切到Sysmac StudioCPU本体又没有串口真正做起来会卡在硬件选型和软件配置上。这篇文章不绕弯直接把无协议串口通信从硬件结构、Sysmac Studio配置、PLC发送程序到串口调试助手验证这条链路讲完后面接扫码枪、标签打印机、串口仪表、LED显示屏时可以直接照这个思路做。NJ501本身不带RS-232C或RS-422A/485串口。所谓“无协议串口通信发送”多数情况下并不是在NJ501主CPU上写一条指令就结束而是要先把一个串行通信单元挂到系统里再在Sysmac Studio中把该单元设置成No-protocol模式最后通过程序或功能块把缓冲区数据送到串口。为了让你清楚知道每一步改哪里下面分三个层面展开硬件层怎么把串口挂上软件层怎么把串口配成无协议程序层怎么把发送逻辑调通。1. 核心能力速览在开始配置之前先给一个总体速览表方便后面调试时对照能力项说明技术主题欧姆龙NJ501实现无协议串口通信发送控制器对象NJ501系列或同平台NJ/NX系列需要使用串行通信单元扩展串口编程软件Sysmac Studio不是CX-One通信类型RS-232C、RS-422A/485上的无协议通信No-protocol主要功能向条码扫描枪、标签打印机、仪表、显示屏、第三方控制器发送ASCII或HEX数据硬件结构NJ501 CPU - CJ单元机架扩展 - CJ1W-SCU31-V1等串行通信单元配置工作量中等主要在于熟记Sysmac Studio的CJ单元配置路径调试工具PC串口调试助手、USB转串口模块是否支持批量发送支持PLC内部通过周期任务或触发队列循环发送程序接口官方Sysmac Library或串口通信功能块不同软件版本略有差异适用读者现场调试工程师、设备集成工程师、PLC程序维护人员从实际经验看这个需求最典型的场景是“PLC要把一个结果字符串发出去”比如称重仪表每次称重完成后把重量值发给PLCPLC处理后把打印内容通过无协议方式发给打印机又比如产线扫码枪读到条码后PLC把当前工单信息以自定义帧格式发送给显示屏。这类通信不涉及Modbus地址映射也不需要FINS节点双方约定好字节顺序就能工作。2. 无协议串口通信原理与适用边界无协议通信就是把缓冲区里的原始字节直接送到串口不附加地址、功能码、CRC校验等协议约束。接收方收到什么就显示什么PLC也按原始字节接收。与Modbus-RTU、FINS串行通信相比区别非常明显通信方式是否带地址是否带CRC/LRC典型设备开发难度无协议通信不带不带串口打印机、扫码枪、LED屏、上位机很简单Modbus-RTU带从站地址带CRC变频器、仪表、温控器中等FINS串行通信带FINS节点带FCS校验欧姆龙PLC互联、触摸屏中等选无协议通信的核心判断依据是对端设备手册是否只要求“发一串字节过去”。比如一台标签打印机它规定只要收到^XA...^XZ这样的ZPL指令就会打印这时PLC完全不需要了解打印机内部状态直接把ZPL文本逐字节发出即可。如果对端设备响应内容里带有站号、功能码说明它本身走的是Modbus再硬用无协议就白费功夫。需要注意的是无协议通信没有链路层的错误回复机制。Modbus收到的报文如果CRC错误从站会不响应无协议通信里数据错了就是错了对端设备如果恰好把错误数据当成命令执行可能产生不可预期的结果。因此发送方的数据帧尽量加自己的包头、包尾、长度和累加校验或者至少保证触发条件不会在通信链路不稳定时自动重发。3. NJ501硬件选型与通信链路3.1 无协议串口的硬件架构NJ501 CPU本体上没有DB9串口常规做法是在NJ系统中扩展CJ系列串行通信单元。典型链路如下NJ501 CPU → CJ单元机架/连接单元 → CJ1W-SCU31-V1 / CJ1W-SCU41-V1 → 外部串口设备这里有两个容易踩的点第一不是把模块直接卡在NJ501前面板上就行。NJ要使用CJ系列的CPU总线单元或特殊功能单元需要对应的CJ单元机架或连接方式项目选型时要确认机架型号、连接模块型号是否与NJ501匹配。具体型号以欧姆龙官方选型手册为准不同NJ机型扩展能力不完全一样。第二串行通信单元本身存在多个型号外观接近但电气接口不同。RS-232C和RS-422A/485不能混用。如果现场距离较短、对端设备是RS-232C常见选择是CJ1W-SCU31-V1这类带RS-232C口的模块如果现场距离较远或者需要连接RS-422A/485总线则要选带RS-422A/485的单元。3.2 为什么先确认端口类型无协议通信发送前必须确认串口的物理电平类型。RS-232C的TXD、RXD是相对GND的电压信号通信距离一般不超过15米RS-422A是差分信号RS-485则在差分基础上支持多点组网。实际接线时如果PLC端是RS-232C而设备端是RS-485中间还要加转换器不能直接拧在一起。下面是一份常见的选型确认清单NJ501具体型号是否已确认CPU固件版本是多少。现场是否有空闲的CJ单元扩展位。外部设备串口是RS-232C还是RS-422A/485。波特率、数据位、停止位、校验方式是什么。外部设备需要接收ASCII字符串还是HEX字节。外部设备接收一帧数据后是否需要回复超时时间给多少。这些信息通常可以从设备手册第一章的通信规格里找到。确认完再下载程序后面返工会少很多。3.3 串口线缆连接与检查RS-232C接线不要默认“收发直连”。PLC作为数据终端设备和PC、打印机连接时通常是PLC的TXD接对方RXDPLC的RXD接对方TXDGND对接。有些设备还需要短接RTS/CTS或DSR/DTR否则无法发送。如果模块型号选的是RS-422A/485则要注意A、B端子不要接反RS-422A的发送和接收是独立的内部还需要终接电阻的现场再接终接电阻。建议第一次测试时单独拉一条短距离串口线PLC端SCU模块通过USB转串口模块接到电脑先不接实际设备。这样能把“PLC配置问题”和“设备端协议问题”隔离开。4. 软件环境准备4.1 Sysmac Studio安装与版本确认NJ501的工程无法用CX-One里的CX-Programmer打开必须在Sysmac Studio中新建。Sysmac Studio可以从欧姆龙官网或正规授权渠道获取文章这里不提供任何非官方下载或破解方式。安装前注意电脑操作系统是否满足当前Sysmac Studio版本要求。软件版本是否支持现场NJ501的固件版本旧版本Sysmac Studio打开新固件工程时可能提示固件版本过低。安装过程中建议关闭杀毒软件实时防护避免授权组件被拦截。软件安装完成后通常还要单独安装授权许可证否则可能进入演示模式无法完整下载监控。相关热词里经常有人搜“Sysmac Studio在哪可以下载”“欧姆龙编程软件怎么下载”。严格说欧姆龙软件属于商业授权软件最稳妥的方式是联系欧姆龙当地技术支持或授权代理商让技术工程师提供正规下载链接和授权申请流程。网上流传的所谓绿色版或离线注册工具不建议用于生产项目一方面可能有木马另一方面还会导致软件授权异常现场服务时会很被动。4.2 现场工程备份在开始配置串口通信前先把原始工程备份一次。Sysmac Studio的工程备份不等于普通复制文件夹还要在“工程”菜单里执行在线备份或另存完整工程确保PLC程序、轴配置、网络配置、单元配置都在一个备份文件里。改串口参数前最好再用SD卡或在线备份把当前PLC内程序完整保存一次。如果现场PLC已经在跑产线要避免在设备运行状态下随意切换单元配置因为部分单元参数下载后需要重启电源或复位特殊单元可能造成短暂停机。5. Sysmac Studio工程与串口通信单元配置5.1 新建工程并添加CJ单元新建工程时选择对应NJ501机型不要只选“NJ系列默认”因为不同NJ型号的轴数、内存容量、EtherCAT能力不同。工程建立后在“配置和设置”里找到CJ单元机架相关项添加CJ单元机架设置机架号。在机架上添加串行通信单元例如CJ1W-SCU31-V1。设置单元号单元号要和模块正面DIP开关设定的数字一致。确认模块版本与软件库匹配。单元号是后面程序访问模块端口的重要依据。一个机架上如果有多个CPU总线单元单元号不能重复否则Sysmac Studio在通信时可能把数据写到错误的单元上。5.2 串口无协议模式配置选中串行通信单元后在单元设置里找到串行端口设置。以常见的两个串口单元为例每个端口都可以独立设置通信协议。我们需要把对应端口设置成“无协议”或“No-protocol”模式。以下参数必须逐一核对参数示例值说明通信模式无协议 / No-protocol不是Modbus-RTU不是协议宏波特率9600 / 19200 / 115200与外部设备一致数据位7 / 8大多数设备用8停止位1 / 2与外部设备一致校验方式None / Even / Odd与外部设备一致发送延迟0ms或10ms某些打印机需要对端处理时间接收字节数0表示不固定无协议接收时经常配合结束代码使用如果外部设备要求的是ASCII字符串那么数据位通常选8如果涉及7位ASCII和奇偶校验的特殊老设备才需要把数据位改成7。校验方式设置不正确时最容易出现“电脑串口助手能收到数据但内容是乱码”的现象。需要注意的是无协议模式下结束代码不是必须的。PLC发送时如果指定了固定字节长度即使外部设备没有接收结束字符也会按长度把数据发出。很多工程师第一次调试时在Sysmac Studio里看到“结束代码”就以为必须填结果发送内容里被自动附加了不需要的字节。只有外部设备明确要求以CR或LF等字符作为一帧结束时才配置结束代码或手动在发送数据末尾加0D 0A。5.3 下载配置到PLC配置完成后把工程“传输到控制器”或在线下载到PLC。下载后不是立即生效部分串口单元参数需要给模块重新上电或执行单元复位。Sysmac Studio的设备诊断窗口中可以看到串行通信单元是否在线、是否报错。如果模块黄色闪烁或报警代码出现优先检查单元号和总线连接。6. PLC发送程序设计与示例框架6.1 发送程序的整体流程无协议发送程序不复杂但要注意触发方式。流程一般如下建立发送数据缓冲区例如数组或结构体。在触发条件上升沿时把待发送的内容写入缓冲区。调用串行通信发送功能块或指令将缓冲区数据交给串行通信单元。功能块返回“发送中”时禁止再次触发防止数据帧覆盖。功能块返回“发送完成”后复位触发信号准备下一帧。如果发送的数据不是固定内容例如要发送“称重值:12.34kg”需要先把数值转成字符串再拼接进发送缓冲区。这个过程建议放在普通周期任务中完成不要在运动控制快任务里做大量字符串拼接。对于NJ平台运动控制任务周期一般是0.5ms到2ms普通任务周期可以到4ms或更高无协议串口发送本身是毫秒级操作放到标准任务或周期更长的任务里更合适。6.2 ST语言发送框架示例下面是一段示意性的ST代码框架。因为不同版本的Sysmac Studio以及不同版本的官方库串口发送功能块名称会有差异实际使用时请以你安装的Sysmac Library中的功能块名称为准。下面代码重点展示“构建缓冲区、上升沿触发、发送忙状态避免重入”的思路// 发送缓冲区假设需要发送 10 个字节 VAR sendFrame : ARRAY[0..9] OF BYTE; sendLen : WORD : 10; sendTrg : BOOL; sendBusy : BOOL; sendDone : BOOL; sendErr : BOOL; errCode : WORD; i : INT; END_VAR // 手动触发或上位机触发 IF sendTrg AND NOT sendBusy THEN // 构建一帧测试数据实际项目中从设备数据区读取 sendFrame[0] : BYTE#16#41; // A sendFrame[1] : BYTE#16#42; // B sendFrame[2] : BYTE#16#43; // C FOR i : 3 TO 9 DO sendFrame[i] : BYTE#16#30; // 0 END_FOR; sendBusy : TRUE; // 调用官方功能块进行发送FB名需要替换为实际库中名称 serialSend_Instance( Execute : TRUE, UnitNo : 0, PortNo : 1, SendData : sendFrame, SendSize : sendLen, Busy : sendBusy, Done : sendDone, Error sendErr, ErrorID errCode ); END_IF; IF sendDone OR sendErr THEN sendTrg : FALSE; sendBusy : FALSE; END_IF;这段代码并不是从某个具体工程里复制出来的而是一个通用的调用框架。真正到现场时你需要根据官方功能块定义调整形参。用这种方式写有一个好处如果后续要改成定时发送或批量轮询只要把sendTrg改成P_1s或其他任务脉冲就可以。6.3 避免把发送逻辑写在过于频繁的任务里NJ501的程序可以分成多个任务。无协议串口发送如果放在1ms周期的运动控制任务里会导致功能块频繁触发而且串口通信单元本身处理速度跟不上容易造成缓冲区覆盖。更合理的做法是单独建一个10ms或20ms周期任务用于通信处理和数据拼接。这样即使程序后续增加多个串行通信单元CPU周期任务里的逻辑也不会影响运动控制任务。6.4 不要直接照搬CX-One程序热词里大量出现CX-One升级包安装、CP1H MOV指令、CJ2M内存详解这些都属于欧姆龙另一条技术线。CP1H、CJ2M用CX-Programmer编写指令表里有MOV、TXD等但NJ平台使用Sysmac Studio程序基于IEC 61131-3的变量和功能块。两个平台的程序不能直接复制。如果调试时遇到“Sysmac Studio里找不到TXD指令”原因是NX/NJ平台的指令体系已经从FINS指令集转向Sysmac Studio功能块体系应该去Sysmac Library中找通信相关功能块而不是对照CX-One的指令名。7. 串口调试助手与上位机联调验证7.1 调试链路搭建在连接真实设备之前先用PC串口调试助手验证PLC有没有把数据发出来。链路如下PLC端串口模块的TXD接USB转串口模块的RXD。PLC端串口模块的RXD接USB转串口模块的TXD。PLC端GND接USB转串口模块的GND。USB转串口模块插入电脑安装驱动。然后打开串口调试助手选择COM口设置与Sysmac Studio中一致的波特率、数据位、停止位、校验位。打开串口后触发PLC发送一次观察调试助手接收区是否出现数据。如果发送的是ASCII内容可以在调试助手里选择文本显示如果发送的是十六进制命令建议选择HEX显示并按设备手册核对每个字节。千万不要在文本显示模式下判断HEX命令这样容易把不可见字符显示成乱码误判为通信故障。7.2 用Python脚本接收验证在没有串口调试助手时也可以用Python快速验证。下面的脚本使用pyserial读取串口数据适合测试PLC定时发送或手动触发后的接收效果import serial # 根据实际端口号修改 ser serial.Serial( portCOM3, baudrate9600, bytesize8, parityN, stopbits1, timeout2 ) print(等待PLC数据按CtrlC退出...) try: while True: data ser.readline() if data: print(收到:, data) except KeyboardInterrupt: ser.close()运行前先确认电脑能识别到USB转串口模块并且串口号没有被其他软件占用。如果PLC端配置的波特率是115200Python脚本里的baudrate也要改成115200。一次收不到数据时不要急着改脚本先检查接线和COM口。7.3 用C# SerialPort读取并打印如果是做上位机集成C#是比较常见的语言。核心代码如下using System; using System.IO.Ports; class SerialTest { static void Main() { using (SerialPort sp new SerialPort(COM3, 9600, Parity.None, 8, StopBits.One)) { sp.Open(); Console.WriteLine(串口已打开); sp.DataReceived (s, e) { Console.WriteLine(收到: sp.ReadExisting()); }; Console.ReadLine(); } } }C#里需要注意DataReceived事件是在后台线程触发的不要在事件里直接操作界面控件。实际工程中通常用线程安全队列或Invoke把接收数据送到UI线程。这个接收验证环节能确认PLC端发送链路是否通畅。如果PC端能稳定收到数据下一步再接真实设备调试打印或显示格式。7.4 验证步骤示例下面的流程可以直接用来判断无协议串口通信发送是否成功在Sysmac Studio中下载工程确认串行通信单元无报警。用一条短串口线连接PLC串口模块和PC调试串口。在PLC程序里建立一个手动发送按钮变量强制或触点为TRUE。PLC发出固定内容例如字符串“NJ501_HELLO\r\n”。PC串口调试助手收到“NJ501_HELLO”即为通信链路通。如果PC没有收到数据检查PLC侧发送完成标志是否置位、模块是否报错。如果收到数据但内容乱码重点检查波特率、校验位和数据位。8. 资源占用与性能观察无协议串口通信发送的数据量通常不大一次发送可能只有几个字节到几十个字节对NJ501的CPU周期影响很小。但性能问题往往不是CPU算力不足而是通信任务设计不合理。常见的观察点有三个第一串口通信模块有没有长时间Busy。如果外部设备没接或者串口线断开发送功能块可能一直处于Busy状态。此时如果程序只用脉冲信号触发一次下一次再触发时由于上一个发送还没完成新数据会被丢弃或覆盖。调试时可以通过Sysmac Studio监控功能块的Busy、Done、ErrorID信号判断卡在哪一步。第二周期性任务是否过长。发送程序如果做了大量字符串拼接例如把浮点数转成字符串、再拼接单位、再查表替换累计执行时间可能会超过任务周期设定值。Sysmac Studio的任务诊断中可以看到任务执行时间超过设定值会报警。遇到这种情况把通信处理放到更长周期的任务中并把字符串拼接与发送分成两个步骤。第三发送频率是否过高。无协议通信没有硬件流控时连续发送几十帧数据可能导致串口缓冲区溢出。更稳妥的做法是在每一帧发送完成后延时或等待对端设备的回应再发下一帧。不要用一个FOR循环在单个任务周期内连续发几百帧那样模块缓冲区会很快占满。现场判断通信是否稳定不能只看PLC程序侧发送完成标志。因为标志只能说明数据已经交给串口模块不能说明外部设备一定收到正确内容。最可靠的方式是在外部设备侧或在线上挂一个串口监听工具观察物理链路层的实际数据。9. 常见问题与排查方法以下表格覆盖了无协议串口通信发送最常见的现场故障问题现象可能原因排查方式解决方案PLC程序发送已经触发但PC收不到数据串口线TXD/RXD接反查看模块和USB转串口指示灯短接测试调换TXD/RXD连接PC能收到数据但内容是乱码波特率、校验位、数据位不一致与设备手册核对参数修改Sysmac Studio串口参数或PC端串口参数串行通信单元在设备诊断中不在线单元号与硬件DIP设置不一致检查单元号旋钮和Sysmac Studio设置统一单元号后重新上电功能块找不到或编译失败Sysmac Studio缺少对应的Sysmac Library查看软件包安装的库列表安装或更新对应通信库触发信号一直为TRUE但只发送一次程序使用上升沿触发但未复位在线监控触发变量状态增加复位逻辑用R_TRIG上升沿触发器发送后Busy一直不消失外部设备未连接或串口线断开查看SCU模块通信指示灯、接线恢复物理连接后重试发送内容多出字节无协议模式下配置了不需要的结束代码检查模块结束代码配置删除结束代码改为按长度发送SCU参数修改后没有生效下载设置后未复位单元查看模块报警状态重新上电或执行单元复位PLC和电脑直连时串口助手收到相同内容重复多次串口助手发送和接收勾选混乱确认只是PLC单方向发送暂时关闭串口助手的自动发送现场排错时建议按照“物理链路 - 模块状态 - 软件配置 - 程序逻辑”的顺序检查。先确认串口线、接口类型、模块指示灯再打开Sysmac Studio的设备诊断如果模块本身报代码异常先处理模块状态再去看程序。很多工程师一上来就检查ST程序最后花了一个小时发现只是RS-485的A/B线接反了。10. 合规与安全使用提示无协议串口通信的调试对象经常是第三方设备现场操作时要注意以下几点修改PLC或通信单元配置前必须确保产线处于安全状态急停回路有效。不要在带电状态下插拔串口通信单元或端子排。与外部设备联调时先单帧测试再连续发送避免错误帧导致设备误动作。涉及上位机、扫码枪、打印机等设备的协议内容要取得设备所有者授权后再编写和调试。工程文件要保留原始版本备份所有测试记录建议截图留存方便后续故障追溯。如果PLC程序通过远程方式调试必须确认远程通道安全可靠避免控制指令被非授权访问。11. 调试建议与下一步方向欧姆龙NJ501实现无协议串口通信发送真正的难点不在“发”这个动作而在硬件链路识别、Sysmac Studio单元配置和触发逻辑设计这三步。第一次做这个功能建议按下面的顺序推进第一先把串行通信单元挂到Sysmac Studio工程里并配好无协议模式下载后通过设备诊断确认模块在线第二用临时手动触发变量发送固定测试帧用PC串口调试助手验证物理链路第三链路通了以后再写真实业务逻辑例如称重数据拼帧、扫码结果发送、打印机指令组包第四为发送功能块做封装统一管理Busy、Done、ErrorID方便后续多个设备复用。需要提醒的是不同型号的欧姆龙串行通信单元、不同Sysmac Studio版本和不同NJ固件版本在功能块名称和配置界面上会有差异。现场调试时如果找不到文中提到的选项优先查看当前版本自带的帮助文档而不是照搬互联网上旧版本工程截图。如果你后续还要把NJ501接到仪表、变频器或温控器上建议优先考虑Modbus-RTU而不是无协议通信因为Modbus有标准的寄存器映射和CRC校验开发效率更高。无协议通信更适合发送自定义显示内容或私有协议命令。两种方式配合使用才能覆盖绝大多数现场串口对接需求。