FEATURED · 精选文章

欧姆龙NJ501无协议串口通信接收实战指南

发布时间 / 2026/9/5 6:19:19
来源 / 创域科博编辑部
栏目 / 资讯中心
欧姆龙NJ501无协议串口通信接收实战指南 NJ501 是欧姆龙 NJ 系列里很多人拿来当“运动控制器”用的型号EtherCAT 轴控、EtherNet/IP 联网都熟。可真到了产线上反倒是被一批最基础的串口设备卡住扫码枪只发 ASCII 字符串称重仪表定时吐一行重量老式测试台返回十六进制帧电平就是 RS-232C协议就是“没有协议”。这种场景不能靠 Modbus-RTU 硬凑也不能因为对方不支持总线就换设备正确做法是让 NJ501 走无协议串口通信把原始字节收进来再自己解析。这篇不讲 EtherCAT只讲一件事欧姆龙 NJ501 怎么做无协议串口的数据接收。先说三个判断这是一项纯软件加配置的工作不依赖额外总线模块项目核心在 Sysmac Studio 的串口参数设置和接收程序结构。适合 9600/19200/38400/115200 这类常规波特率下的可变长或固定长帧接收数据帧怎么结束由你配置的“结束条件”决定。实际调试时需要串口调试助手或真实从站设备配合最好通过 Ethernet 口在线监控避免同一个 RS-232C 口既当通信口又当编程口。文章会按“应用边界 → 硬件准备 → Sysmac 设置 → 接收程序 → 在线调试 → 帧解析 → 排错清单”的顺序展开。你不需要记住所有截图位置只要手里有一台 NJ501 和一套 Sysmac Studio按这个流程走一遍大部分无协议接收项目都能套上。1. 核心能力速览项目说明控制器欧姆龙 NJ501 系列机器自动化控制器编程软件Sysmac Studio通信模式无协议串口通信Non-protocol常用物理接口CPU 内置 RS-232C、扩展串行通信单元接收对象扫码枪、仪表、单片机板卡、上位机下发的原始字节数据形式ASCII 字符串或十六进制帧接收完成条件固定字节数、终止字符如 CR/LF等后续处理帧校验、ASCII 转数值、状态机解析、缓存转发是否需要额外授权不需要使用系统自带串口功能典型门槛熟悉 Sysmac Studio 基础操作能完成在线连接与下载这套能力的核心价值不是“串口能通”而是“把不可控的字节流变成可控的帧数据”。真正花时间的不是通信参数而是接收触发条件怎么设置、缓冲数据怎么及时取走、断帧粘帧怎么处理。2. 适用场景与使用边界无协议串口通信的典型场景有这几类扫码枪读取条码后通过 RS-232C 把条码内容发给 PLC。称重仪表按固定周期输出一行 ASCII 数据PLC 需要截取重量字段。检测设备返回十六进制帧PLC 负责判断状态字。老式数控机床、视觉控制器、单片机控制板需要和 NJ 系列做原始数据交换。这些设备有一个共同特点不跑 Modbus不跑 HostLink也不支持 EtherNet/IP。它们只负责“把数据发出来”能不能被正确接收完全看接收端配置。也要说清楚不适合什么场景对实时性要求极高的运动控制联动不要靠串口做主通道。串口天然是低速异步通道数据拥塞和延迟都不可控。一次通信需要几十种命令交互、还要带复杂状态管理时不要硬写无协议。可以考虑 Modbus-RTU 或 HostLink它们自带协议栈省去大量解析工作。长距离传输超过 15 米左右RS-232C 电平不稳定应改用 RS-422/RS-485 或加转换器。关于安全和合规工业现场必须注意1. 接线、下载程序、在线修改参数前应确保设备处于安全状态。 2. 串口接收到的数据不要直接用于轴位置、速度、力矩等安全相关控制除非程序做了完整校验和权限管理。 3. 涉及设备厂家私有协议、版权固件或未公开报文时应先获得授权再做解析与转发。 4. 不要在生产设备上直接验证未完成的解析逻辑建议先离线模拟或旁路测试。这一段不是套话。无协议通信意味着 PLC 不判断数据内容是否合理全由你的梯形图或 ST 程序负责。一旦把错误的数据当成有效测量值用设备误动作的风险会明显上升。3. 环境准备与前置条件做 NJ501 无协议串口接收需要准备以下内容。3.1 硬件清单硬件作用NJ501 CPU接收数据并执行解析逻辑串口设备扫码枪、仪表或 PC 串口调试助手RS-232C 通信线PLC 与外部设备连接USB 转串口 / PCI 串口卡PC 连接外部设备侧或 PLC 侧网线NJ501 通过 EtherNet/IP 口连接 Sysmac Studio 在线调试如果确认 NJ501 CPU 自带 RS-232C 口可以直接使用。对于不带串口的型号一般通过 CJ 单元适配器扩展串行通信单元不同型号的扩展方式不同。最稳妥的办法是打开硬件手册确认本机 CPU 的串口位置和通信单元型号。3.2 连接关系规划无协议接收调试时建议把“编程通道”和“数据通道”分开PC 1: Sysmac Studio 通过 Ethernet 连接 NJ501用于下载程序和监视变量。 PC 2: 串口调试助手通过 USB 转 RS-232C 连接 PLC 的 RS-232C 口模拟外部设备发送数据。如果现场已经接了真实设备就不需要 PC 2。用真实设备发数据测试更可靠但问题定位速度会慢一些因为你看不到 PLC 到底收到什么字节。两种方式可以结合先用 PC 串口助手模拟发送验证配置和程序再切换成真实设备做最终通信验证。3.3 软件准备软件用途Sysmac Studio项目开发、参数设置、程序编写、在线监视串口调试助手 / 串口终端发送测试帧查看回显欧姆龙 NJ 系列相关手册确认指令参数、缓冲区和错误代码不需要额外安装通信库Sysmac Studio 内部已经集成了无协议串口通信需要用到的系统指令和功能块。只是不同版本的软件在指令助记符和库组织上会略有差异实际开发前建议先打开软件里的指令帮助核对一次。4. Sysmac Studio 中的无协议串口参数设置进入 Sysmac Studio 后无协议通信的设置位置在控制器的“内置串行端口设置”中。用文字描述就是配置和设置 → 控制器设置 → 内置串口设置在这个页面里核心要改的是两部分通信格式以及接收完成条件。4.1 通信格式设置通信格式必须与外部设备完全一致。常见的参数项如下参数推荐设置说明串行通信模式无协议不使用 Modbus/HostLink波特率9600 / 19200 / 38400 / 115200与外部设备一致数据长度8 bit多数设备默认停止位1 bit与设备一致校验位None / Even / Odd与设备一致流控None不启用 RTS/CTS 时保持关闭如果外部设备说明书没有明确写帧格式先用串口助手连接设备抓包确认波特率、停止位和校验位再写入 PLC。不能凭感觉猜。4.2 接收完成条件设置无协议通信的难点不在“收字节”而在“怎么知道一帧数据收完了”。Sysmac Studio 中一般可以配置接收完成条件常见有两种方式适用场景优缺点接收字节数固定协议固定长度例如 8 字节一帧简单可靠但无法处理变长帧终止字符数据以 CR、LF 或 CRLF 结束适合 ASCII 文本帧但设备必须带结束符比如扫码枪默认很多是在条码内容后面补CR或CRLF这时可以把接收完成条件设置为“终止字符”。设备发送内容ABC123加回车PLC 收到回车就认为一帧数据已经结束然后触发后面的接收程序。如果外部设备每帧固定返回 16 个字节则优先采用“接收字节数”方式。它不依赖特殊字符只要数量到了就触发。需要提醒一点接收完成条件只是告诉系统“这一帧收完了”并不等于你把数据读回用户程序了。缓冲区里的数据还要由接收指令或功能块取走否则下一帧进来后可能产生覆盖或遗留问题。4.3 保存设置并传送到 PLC参数修改完成后需要执行“传送到控制器”操作。串口参数通常必须在控制器复位后才会完全生效。操作顺序建议1. 项目离线修改。 2. 保存项目。 3. 连接控制器。 4. 传送到控制器。 5. 复位控制器。 6. 复位后确认设置生效。如果控制器在线修改不允许直接改写串口模式就先把 CPU 切到编程模式或停止模式。具体操作以当前 Sysmac Studio 软件提示为准。5. 接收程序设计思路无协议接收的经典逻辑包含四个状态等待接收完成标志 → 读取串口缓冲区 → 解析数据帧 → 复位标志并进入下一轮不要试图在主任务里一边做运动控制、一边用密集轮询去等串口数据。NJ 系列本身是多任务架构建议单独建一个通信任务周期可以设置得比主任务稍松比如 10ms 到 50ms根据现场数据量定。核心判断条件如下信号含义程序处理接收完成标志系统认为一帧已结束触发读取缓冲区动作接收数据长度实际收到多少个字节决定解析范围状态字 / 错误代码通信端口是否有异常记录日志并复位用户数据数组从缓冲区复制出来的原始数据送入解析函数下面是一个结构化文本风格的逻辑示意。注意不是完整编译程序只是把接收逻辑表达清楚实际变量名需要根据你的工程调整。// 伪代码串口接收主逻辑 IF bRecvComplete THEN // 1. 把当前接收缓冲区的数据复制到用户数组 FOR i : 0 TO uRecvLen - 1 DO uFrame[i] : RawBuffer[i]; END_FOR; // 2. 记录当前帧长度 uFrameLen : uRecvLen; // 3. 置位帧就绪标志交给解析程序 bFrameReady : TRUE; // 4. 清理接收完成标志允许继续接收下一帧 bRecvComplete : FALSE; END_IF;实际项目中读取缓冲区这一步通常不是直接写RawBuffer[i]而是调用系统提供的串口接收指令或功能块把内置端口接收缓冲区的内容搬运到用户指定地址。指令名称在不同 Sysmac Studio 版本中可能不同建议直接打开 Sysmac Studio 的指令帮助搜索以下关键字Serial Receive Recv RXD 无协议找到“接收数据”相关的指令或功能块后按 F1 查看参数说明用“源端口 / 目标数组 / 接收长度”的方式调用。6. 接收程序的解析层处理把原始字节从串口缓冲区读出来之后下一个问题是这些字节到底代表什么6.1 ASCII 字符串帧解析条码、仪表读数、设备状态信息很多都直接以 ASCII 字符发送。比如收到ABCD1234\r\n其中\r是回车符\n是换行符PLC 需要把有效字符ABCD1234截取出来。如果不需要换行符可以按字节索引截取从第 0 字节取到最后一个有效字符或者遇到0x0D、0x0A就结束。6.2 十六进制帧解析检测设备常使用十六进制帧例如一帧 7 字节AA 01 10 00 12 23 FE这串数据通常包含帧头、命令码、数据字段和校验字节。解析时先找帧头AA再按固定位置取数据最后校验FE。6.3 BCC 校验逻辑示意很多无协议设备不用 Modbus 自带的 CRC而是自己定义 BCC异或校验。以下用 ST 写一个简化思路FUNCTION F_BccCheck : BOOL VAR_INPUT uFrame : ARRAY OF BYTE; uLen : UINT; END_VAR VAR i : UINT; bcc : BYTE; END_VAR bcc : 0; FOR i : 0 TO uLen - 2 DO bcc : bcc XOR uFrame[i]; END_FOR; IF bcc uFrame[uLen - 1] THEN F_BccCheck : TRUE; ELSE F_BccCheck : FALSE; END_IF;这是一个比较典型的帧尾校验写法。具体数组类型、长度变量和寻址方式要按 Sysmac Studio 实际支持的语法微调。重点是理解校验思想发送端把所有数据字节做异或得到校验字节放在帧尾接收端重新计算异或和最后一字节比较。一致则认为帧有效不一致要丢弃或请求重发。6.4 多字段数据提取对于像称重仪表输出ST,001.234kg\r\n这种字符串收到后不能直接拿数组往数值变量里放。先把有效字符提取出来再定位到数值部分用一个字符一个字符判断的方式组成临时字符串最后转换成浮点数。这一步在 NJ 系列上可以用字符串处理指令但更稳妥的是自己写一个状态机式解析逐字节处理避免依赖系统和设备定义的差异。7. 在线调试与变量监视无协议通信调试时Sysmac Studio 的在线监视非常关键。建议打开以下变量变量监视目的接收完成标志确认 PLC 是否认为一帧已结束接收长度变量判断设备是否真的发过来数据用户数据数组查看收到的原始内容状态字检查端口异常和溢出情况当你用 PC 串口助手发送一帧数据后正常顺序应该是串口助手发送 → 接收完成标志由 OFF 变 ON → 接收长度更新 → 用户数据数组出现内容如果接收完成标志一直不变化先检查通信参数再看外部设备是否真的把数据发出去了。调试期间最容易犯的错误是只盯 Watch 窗口不关注数据更新速度。串口数据是异步到达的手动刷新监视可能看不到一瞬间的置位。可以配合 Sysmac Studio 的数据跟踪功能把接收完成标志和接收长度变量加入跟踪触发条件设为接收完成标志上升沿。这样即使数据一闪而过也能抓到。实测速度参考要说明不同外围设备发送周期差异很大。有的扫码枪是触发一次只回一帧有的仪表每 100ms 就发一行。对于高频数据发送建议在真实设备接入前先确认程序单帧处理耗时如果处理逻辑太重会出现缓冲区新数据覆盖旧数据的情况。8. 用串口调试助手模拟发送在没有真实设备的情况下用 PC 串口助手模拟是最快的验证方式。连接方式如下PC (USB转RS-232C) → RS-232C线缆 → NJ501 内置 RS-232C 口PC 端用 Python 也可以完成同样的发送测试。下面是一个简化脚本模拟外部设备定时发送一帧十六进制数据import serial import time ser serial.Serial( portCOM5, # 按实际串口号修改 baudrate9600, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout1 ) frame bytes([0xAA, 0x01, 0x10, 0x00, 0x12, 0x23, 0xFE]) try: while True: ser.write(frame) print(send:, frame.hex( )) time.sleep(1) except KeyboardInterrupt: pass finally: ser.close()如果你要测试 ASCII 数据把 frame 换成frame bABCD1234\r\n发送后回到 Sysmac Studio 监视窗口看用户数据数组确认收到的十六进制内容与发送内容一致。注意用 PC 串口助手模拟时要把自己当成“外部设备”。NJ501 作为接收方PC 只发不收也可以。如果测试双方都是只发不收必须确认接线中的发送和接收引脚交叉正确否则 PC 发出的数据根本到不了 PLC。9. 接口 API 与批量数据采集的扩展思路无协议串口通信本身不涉及上层 API它做的是把外部设备原始数据引到 PLC 内部。但在实际工程项目中数据往往会继续往上层传递。常见扩展方向是NJ501 接收完数据并完成解析后把结果写入内部变量再通过 EtherNet/IP、OPC UA 或 Socket 服务让上位机读取。上位机拿到数据后可以写入数据库、做看板显示或者参与工艺统计。如果要做批量采集建议在 PLC 内先建立一组环形缓冲区接收完成 → 解析成功 → 数据写入 FIFO → 上位机定期读取 → 清除已读数据FIFO 的好处是避免上下位机速度不匹配导致数据丢失。同样要提醒上位机通过网口读取 PLC 数据时必须做好访问权限控制不要默认开放所有读写变量。尤其在工业现场任意写入可能触发设备动作需要严格限定可写变量范围。10. 资源占用与实时性观察NJ501 的串口接收通常不会产生特别高的 CPU 占用但不代表可以随意写代码。以下几个因素会直接影响性能因素影响接收任务周期周期越短响应越快但 CPU 占用越高数据解析复杂度大量字符串转换和循环会拉长任务执行时间接收数据频率高频数据会造成缓冲区频繁变化缓冲区大小设置过小可能丢帧过大会积累旧数据串口波特率波特率越高单位时间到达的字节越多建议把通信任务和运动控制任务分开。如果 NJ501 本身要做多轴插补或高速定位串口解析不要放在同一个高速任务里。低速任务里完成字节接收再通过事件或标志通知主任务这样能避免串口处理拖累运动控制。对于长时间无人值守运行要在程序里增加看门狗式逻辑。比如设备规定每秒发送一帧数据如果超过 3 秒没有新的接收完成标志就要记录通信超时并输出告警。这样即使外部设备掉线PLC 侧也能第一时间发现。11. 常见问题与排查方法无协议串口接收的问题绝大多数出现在接线、通信参数和接收完成条件三个环节。可以参考下表排查。问题现象可能原因排查方式解决方案完全收不到数据接线错误收发引脚不对检查 PLC 和设备的 TX、RX、GND 连接交叉连接或按设备手册重新接线完全收不到数据波特率、校验位不一致在串口助手中先抓包确认设备
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻