
平时调试带CAN总线的设备CODESYS和PCAN-USB这个组合绝对算得上高频搭配。CODESYS负责PLC逻辑和CANopen协议栈PCAN-USB负责把上位机或软PLC拉进CAN网络两边单独用都挺顺手一放到一起就各种“玄学”问题驱动装不上、CODESYS设备树里找不到PCAN、明明发帧了PCAN-View却啥也看不到。这篇文章把从驱动安装到CAN通讯测试的完整流程重新捋一遍把我实际踩过的坑和验证过的办法都列出来给正在配这套环境的朋友一个能直接照着抄的路线。1. 为什么CODESYS和PCAN-USB这对组合值得单独写篇避坑指南先说说这个组合的定位。CODESYS是IEC 61131-3开发平台经常用来做软PLC、运动控制、CANopen主站/从站PCAN-USB是PEAK出品的CAN接口卡在工业调试和车载总线测试里保有量很大优点是驱动稳定、PCAN-View调试工具免费、接口文档清楚。把这两个放一起最典型的使用场景是用一台工控机或普通PC跑CODESYS Control Runtime通过PCAN-USB连接到外部的伺服驱动器、IO模块或者其他CANopen设备。CODESYS在应用层做逻辑CANopen协议栈负责NMT、PDO、SDO、心跳PCAN-USB在物理层把总线的差分信号转换为USB数据包。看起来就是把一个设备插到电脑上再在CODESYS里加个设备中间能有什么坑实际情况是CODESYS和PCAN各自都觉得自己是总线的主人谁先占用通道、设备描述文件有没有装、位时序参数是否一致、终端电阻有没有正确匹配任何一环出问题都表现为“明明配置没问题但就是不通”。这篇文章适合这几类人第一次把PCAN-USB接到CODESYS工程里的自动化工程师、在实验室用CANopen主站但始终调不通现场设备的调试人员、以及想搞清楚PCAN-View抓到的帧和CODESYS内部配置到底怎么对应起来的人。下面不按官方手册顺序讲按我实际踩坑的顺序讲这样更容易避开同样的坑。2. 驱动安装阶段别急着把USB线插上去顺序和版本都很关键很多人拿到PCAN-USB后的第一个动作是插电脑然后发现Windows在后台“自动装驱动”似乎也装好了结果打开CODESYS添加设备时搜不到任何PEAK相关的东西。问题就出在这个“自动装驱动”上。2.1 PEAK官方驱动要装两遍Windows自动安装只算半次PCAN-USB不是USB转串口那种免驱设备它的驱动分两个层面一个是USB设备在Windows设备管理器里的底层驱动另一个是给应用程序和第三方软件使用的PCAN-USB应用接口也就是通常说的PCAN Driver。我建议的安装顺序是先去PEAK官网下载对应型号的驱动安装包注意区分PCAN-USB、PCAN-USB Pro、PCAN-USB FD普通版和FD版虽然外观像驱动不能混装。在设备未插入的状态下先运行安装包把驱动文件装到系统里。安装完成后再把PCAN-USB插到USB口等Windows识别。打开设备管理器看是否出现“PCAN-USB”或“PCAN-USB Pro”设备名并且前面没有黄色感叹号。先装驱动再插线这个顺序能避开很多设备识别为“未知USB设备”的问题。系统已经预装了驱动文件后插线瞬间就能正确绑定设备不会去Windows Update乱找匹配驱动。如果装完发现设备管理器里还是问号我的处理办法是拔掉PCAN-USB在设备管理器里卸载当前错误设备卸载后不要自动扫描硬件再运行一次PEAK驱动安装包选择修复模式最后重新插上设备。这一套下来绝大多数识别问题都能解决。2.2 设备管理器里没有COM口不是故障别被串口思路带偏这是最常见的一个认知误区。PCAN-USB在系统里不会枚举成COM口它不是UART转CAN的调试线而是一个完整的CAN控制器加USB桥接器。你打开设备管理器看不到“COM3”这种东西是正常的它会出现“PCAN-USB”或者出现在“通用串行总线设备”分类下。如果你在设备管理器里看到的是类似“USB Serial”或者“COM口”反而要警惕那可能是驱动被Windows替换成通用串口驱动了必须卸载后重新安装PEAK官方驱动。否则CODESYS根本不知道这个设备是CAN通道。2.3 用PCAN-View先做一次驱动自检比直接进CODESYS省事驱动装完先别急着开CODESYS建议先打开PEAK自带的PCAN-View工具验证驱动是否真能被外部软件正常访问。在PCAN-View里选择对应的PCAN通道比如PCAN-USB或PCAN-USB 1选择一个初始波特率通常用500 kbit/s然后点OK打开通道。如果能正常打开窗口且右下角没有报错说明驱动层没问题。这里插一句经验不要在CODESYS配到一半才想起测驱动。先用一个最小系统确认PCAN-USB本身是好的可以省掉后面至少一半的排查时间。如果PCAN-View都打不开通道那大概率是驱动安装有问题而不是CODESYS工程配错了。3. CODESYS工程侧从设备仓库到CAN端口映射配置要一条线串起来驱动装好了PCAN-View也能打开通道了接下来才是真正容易翻车的区域让CODESYS认识这张PCAN-USB卡。3.1 先确认CODESYS里有没有CAN和PCAN的设备描述文件CODESYS默认自带的设备树里并不是一定有PEAK相关条目。它本身只是一个可扩展的编程环境具体支持哪些现场总线、哪些硬件要看CODESYS Installer里安装了哪些组件以及工程里加载了哪些设备描述文件。我在新装CODESYS环境时通常这样检查打开CODESYS Installer确认是否安装了“CODESYS CANopen Manager”和对应Runtime的CAN支持组件。进入CODESYS工程在设备树里右键Device节点选择“添加设备”在弹出的设备仓库里搜索“CANbus”或“CAN”看有没有CAN接口节点。再搜索“PCAN”看有没有PEAK的USB设备描述文件。如果CANopen Manager有但PCAN设备描述文件没有可以到CODESYS Store里搜PCAN相关包下载安装后重启CODESYS。重启很重要因为设备仓库的刷新不会每次都自动加载新的设备包。我用的版本是CODESYS V3.5 SP19配合PEAK 4.x驱动设备仓库里能直接找到PCAN-USB的接口节点。如果你用的是其他版本菜单叫法可能略有差异但逻辑是一样的CODESYS必须先认识“PCAN-USB是CAN通道”然后才能把它当CAN接口用。3.2 PCAN通道在CODESYS里的正确添加方式在CODESYS工程里典型的结构是Device (CODESYS Control Win V3 或 CODESYS Control for Linux) CANbus (PCAN-USB) CANopen_Manager Node_1添加的时候先在Device下面添加一个CANbus节点然后在CANbus的属性里把Interface或Driver类型选成PCAN-USB并指定通道号。这个Channel不要想当然填1要看PCAN-View里看到的通道号。如果PCAN-View里显示的是PCAN-USB 1那CODESYS里的通道索引通常也是0或1不同版本对起始编号的定义不一样。最好在CODESYS的Interface下拉列表里看有没有其他选项只有一块PCAN-USB的情况下选默认项通常就行。这里常常出现的坑是有人只添加了CANopen_Manager没有先添加CANbus底层的PCAN接口。CANopen_Manager只是协议栈它需要跑在一个具体的物理通道上。没有底层CANbus接口编译能过但运行时根本发不出去帧。3.3 CANopen主站参数配置重点看波特率、节点ID和心跳CANbus接口配好之后CANopen_Manager和Node的参数直接影响能不能和外部设备对上话。我每次都要核对三个地方波特率CANbus接口的波特率必须和总线上所有节点一致。PCAN-View、CODESYS CANbus接口、外部从站的波特率任何一边不对都会表现为通讯失败或大量错误帧。Node ID要访问的从站在总线上是几号CODESYS里就要配几号。比如伺服驱动器上设的是3号那CODESYS Node_1的Node-ID就写3。心跳周期从站如果没有周期性发心跳主站会在Heartbeat Timeout后报节点丢失。这个周期要和从站实际心跳周期匹配主站超时时间一般是从站心跳周期的3倍。这三个参数都不算复杂但它们分散在CANbus属性、CANopen_Manager属性、Node属性和EDS文件里改起来不像PLC程序那样直观。每次通讯不通我先检查这三个是否一致再看线缆。3.4 下载工程前的最后检查清单工程配置完先别急着点登录下载。我习惯按下面这张清单过一遍CODESYS的Channel号是否和PCAN-View里实际使用的通道一致CANbus波特率是否和外部设备一致CANopen Manager的启动选项是否勾选了“自动启动网络管理”从站设备是否导入了正确的EDS文件Node ID是否和实际设备拨码一致PCAN-USB有没有被PCAN-View占用如果PCAN-View还开着通道CODESYS可能打不开同一个通道。这最后一条特别容易忘。PCAN-View开着时CODESYS Runtime再去打开同一个PCAN通道可能会报“设备被占用”或者直接打不开CAN口。所以在CODESYS登录前最好先把PCAN-View关掉或者改用另一块PCAN-USB做监听。4. 通讯测试从PCAN-View收到帧到确认业务链路完整闭环整套配置到底通没通不能只看CODESYS这边不报错最终要落到CAN总线上真的能看到对应帧。这一步推荐用一个单独的监听端来完成。4.1 测试拓扑CODESYS一路PCAN-View监听一路我的标准测试接法是准备两块PCAN-USB一块给CODESYS所在的主机另一块接一台装了PCAN-View的电脑或者另一台工控机。两块PCAN-USB的CAN_H接CAN_HCAN_L接CAN_L地线最好也接在一起。如果现场只有一台电脑也可以在同一台电脑上插两块PCAN-USB一块给CODESYS一块给PCAN-View。我自己更推荐这种方式省得两台电脑之间又要处理IP和时间同步的问题。总线两端都要有终端电阻。高速CAN总线的终端电阻标准是120Ω通常放在物理总线的最远两端。如果只有两个节点每块PCAN-USB接口的CAN_H和CAN_L之间各放一个120Ω电阻。不要只在中间节点放一个120Ω那样波形反射很严重通讯质量会不稳定。4.2 在PCAN-View里观察CODESYS发出的帧把PCAN-View打开到监听通道波特率选和CODESYS一致然后启动接收。接着在CODESYS工程里把PLC切到运行状态CANopen Manager如果配置了自动启动在PLC运行后会执行NMT启动命令这时在PCAN-View里应该能看到类似这样的信息CAN ID 0x000的NMT管理帧数据区包含目标节点号和启动命令。心跳帧CAN ID是0x700加节点号比如3号节点就是0x703数据区是从站心跳时间。如果有配置SYNC同步帧还会看到CAN ID 0x080的周期性同步帧。如果配置了TPDO会看到发送节点号对应的PDO CAN ID例如节点3的TPDO1默认CAN ID是0x183。当PCAN-View里能看到这些帧时至少证明了一条链路已经通了CODESYS运行时把CANopen协议栈的数据交到了CANbus接口CANbus接口把帧发上了CAN总线PCAN-View完整收到了。4.3 验证PDO映射和数据内容而不是只看“有帧”很多时候大家看到PCAN-View里有帧在跳就认定通讯正常但其实可能只收到了NMT和心跳PDO的数据根本没发出来或者发的不是预期的数据。真正完整的测试要对着PDO映射表逐条核对。在CODESYS的PDO映射配置里一个TPDO会关联若干个映射变量比如把控制字的地址映射到TPDO1的字节0、把目标速度映射到字节2和字节3。启动后PCAN-View里看到0x183这个ID就要把数据区的字节拆开和CODESYS里的映射变量值对比。我用过一个很土但很有效的验证方法在PLC_PRG里写一段临时逻辑每隔100毫秒给某个映射变量加1然后看PCAN-View里对应PDO的数据区是否同步递增。如果PCAN-View里看到的值一直在变说明PDO从CODESYS到总线的路径是通的。测完再把这段临时逻辑删掉防止影响现场逻辑。如果PDO的CAN ID和数据对不上先查PDO的通讯参数特别是Transmission Type。默认情况下把Transmission Type配成“同步周期”后PDO只有在收到SYNC帧后才会发送如果主站没有发SYNCPDO就一直不出现这是很常见的“现象”。到这里完整链路基本验证闭环了驱动层通了、CODESYS设备树通了、CANopen协议栈通了、PDO数据也进了总线。后面再遇到通讯问题就有明确的分层排查基础了。5. 实测排障链路从现象反推根因少走一小时弯路就算前面全按流程走还是可能遇到各种“看起来没问题但就是不对”的情况。下面这几种是我在实际项目里反复遇到的每个都给出从现象到根因的排查思路。5.1 现象一PCAN-View打开正常但收不到CODESYS发的任何帧先确认PCAN-View选择的波特率和CODESYS CANbus属性里的波特率完全一致。CAN总线上所有节点要用同一个波特率否则帧格式都是错的。再检查CODESYS运行时到底有没有真正执行CANopen启动。如果CANopen_Manager的自动启动没有勾选PLC运行了也不会去NMT启动从站总线上自然没有帧。手动在程序里调用一次网络管理启动函数或者把自动启动勾上再看。最后检查通道占用。如果CODESYS Runtime的另一个实例、或者其他软件已经把PCAN-USB打开了CODESYS可能仍然“假运行”实际上CAN口没有真正打开。把能占通道的软件全部退掉再重新登录CODESYS运行。5.2 现象二PCAN-View里错误帧刷屏错误帧通常表现为CRC错误、位填充错误、各种报错帧连续出现。优先怀疑波特率不对、终端电阻缺失、总线接地问题。波特率不对时最容易在总线上产生大量错误帧因为各节点对电平采样时间不一样。终端电阻缺失或电阻匹配错误会导致信号反射在长线和高速率下尤其明显。还有CAN总线通信不是只靠差分信号就能完成的CAN_H和CAN_L参考地不稳也一样会出错误帧。两块设备如果供电系统不一样最好把GND接在一起。5.3 现象三CODESYS提示节点心跳超时但PCAN-View能看到心跳帧这种情况很有意思总线上明明有心跳帧CODESYS却报超时。第一反应看从站节点号PCAN-View里心跳帧的CAN ID是0x700加节点号比如0x703就是3号节点。CODESYS节点配置里的Node ID如果写的不是3它当然找不到这个从站。第二看EDS文件里的心跳配置。有些从站默认心跳是1000毫秒CODESYS默认超时却设成了300毫秒那就会反复超时。这个参数在从站节点的心跳对象里改主站侧的Heartbeat Timeout要大于从站的心跳产生周期。还有一种少见但真实存在的情况同一块PCAN-USB被另外一个进程也在读帧而且那个进程把某些帧过滤掉了导致CODESYS虽然能收到驱动数据但驱动回调被占用协程式处理不过来。这种问题排查起来很头疼遇到这种情况我的做法是关掉所有其他占用同一个PCAN通道的软件然后单独跑CODESYS验证。5.4 现象四单独用PCAN-View互发正常进CODESYS就不行对着CODESYS配置一顿查之前先做一个隔离测试用两台电脑分别跑PCAN-ViewA机发B机收确认PCAN-USB和整条CAN总线本身是健康的。如果这都不通问题在驱动或物理层跟CODESYS无关。如果PCAN-View互发正常就把问题范围缩小到CODESYS侧。重点检查CODESYS设备树里CANbus节点选择的驱动有没有选中PEAKChannel是否对应Runtime的架构是32位还是64位PCAN设备包是否和Runtime架构匹配。这个排障思路很快因为前面已经把物理层和驱动层排除掉了。5.5 一张表收下常见问题现象第一嫌疑第二嫌疑第三嫌疑PCAN-View没有帧波特率不一致CODESYS没启动NMT通道被占用错误帧刷屏终端电阻缺失波特率不一致地线电位差心跳超时节点号不匹配心跳超时时间太短EDS配置错误CODESYS打不开CAN口PCAN-View还占着通道驱动版本不匹配Runtime架构不一致设备管理器问号驱动安装顺序不对被Windows自动替换驱动USB供电不足每一条背后我都加了个习惯测CAN通讯前先拿万用表量一下总线两端的CAN_H对CAN_L电阻。如果只有两个节点且都接了终端电阻测量值应该在60Ω左右如果没接终端电阻测量值会接近无穷大。这个动作几秒钟但能直接过滤掉一半以上的“玄学”问题。6. 最后分享一个实用习惯CODESYS加PCAN这套链路真正排起错来最怕的就是“每一层都好像对但整体就是不通”。所以我现在每到一个新的现场都会按驱动、通道、波特率、终端电阻、节点ID、PDO映射这个顺序固定检查不跳步也不凭感觉改参数。还有个小技巧CODESYS工程里的CANbus参数、CANopen_Manager参数和Node参数建议每一项改动都记录到一个简单的对照表里。别小看这个习惯现场设备一多谁记得清上次是在哪个版本里把心跳改成多少的有了记录改回来就是几分钟的事。这套流程跑通之后后面再扩其他从站设备就轻松多了。无非是导入EDS、配PDO映射、设节点号测试链路不用再从驱动层开始折腾。希望这篇能帮你少走点弯路一次把CODESYS加PCAN-USB的通讯测通。