
搞S7-1200配KINCO伺服这套组合时我最头疼的不是PLC程序怎么写而是CANopen通信这块的配置。说白了组态软件点几下鼠标谁都会可一旦总线起不来、PDO收不到、伺服抖成筛子那才是真正考验人的地方。这篇就把我用CM CANopen模块连接KINCO伺服的完整流程和踩坑记录整理出来从硬件接线到PDO映射表再到调试思路一次讲透。1. 整体方案设计与选型思路1.1 为什么不用PROFINET偏要选CANopen做单机设备或者中小型产线时S7-1200配伺服有很多种通信选择最省事的是S7-1200直接用PROFINET连支持PN的伺服驱动器一条网线搞定组态也简单。但问题在于支持PROFINET的伺服驱动器普遍贵一截而且很多国产伺服虽然带PN口实际用起来协议兼容性时不时闹点脾气。如果项目里伺服数量不多对同步精度要求没那么变态CANopen是性价比非常高的方案——KINCO的伺服驱动器本身就带CANopen接口再加一块西门子CM CANopen通信模块整条链路成本直接就压下来了。CM CANopen模块在西门子产品线里的定位很明确给S7-1200扩展CANopen主站能力。S7-1200本体没有CANopen接口CPU自带的是PROFINET和PROFINET/以太网口想走CANopen总线就必须挂这个模块。模块本身支持CANopen主站协议理论上一个模块最多可以管理几十个从站节点实际项目中带个十几台伺服完全没问题。对于KINCO这类国产伺服来说CANopen接口是标配功能协议栈本身就是标准DS402和西门子的CM模块对接属于标准操作不需要额外的硬件转换器也不用考虑两套系统之间协议不兼容的破事。1.2 硬件选型和接线细节我常用的搭配是S7-1200 1214C DC/DC/DC加上CM CANopen模块型号具体是6GK7542-5FX00-0XE0注意这是CM CANopen模块不是CM DP模块两者外观相似但协议完全不同订货的时候一定要看清楚。KINCO伺服这边我用的比较多的是CD420和CD430系列驱动器上自带CANopen通信口用的是标准的D-Sub 9针接口接线方式非常标准化。接线这块有个老生常谈但特别多人犯的错误CAN总线一定要用双绞屏蔽线CAN_H和CAN_L是一对双绞线屏蔽层单端接地千万不能把CAN_H和CAN_L随便拿普通电线代替距离短的时候可能没事走线一长或者现场变频器干扰一大通信立刻给你脸色看。总线两端必须接120欧终端电阻这个电阻的作用是消除信号反射很多人只在一端接了电阻另一端忘了结果高速通信时数据频繁报错。CM CANopen模块输出端自带终端电阻开关可以通过模块侧面的拨码开关启用KINCO驱动器那头就需要在接线端子或者总线连接器上并一个120欧电阻。特别注意终端电阻是接在最末端设备上的不是每台设备都接是物理链路的最开始和最结尾各一个。KINCO伺服驱动器的CANopen口通常是D-Sub 9针公头接线定义如下引脚信号说明2CAN_LCAN低电平7CAN_HCAN高电平3GND信号地可选用其他-一般不用模块侧和驱动器侧接线就是要确保CAN_H对CAN_H、CAN_L对CAN_L别接反了。接反的后果可不是“通信不上”这么简单高速时总线直接报错严重了还可能损坏收发器芯片。有同行告诉我他遇到过一次接反的情况两个设备都没烧但就是怎么都进不了Operational状态排查了一上午才发现是两根线对调了。2. 组态配置与参数设置全流程2.1 TIA Portal中组态CM CANopen模块的完整步骤先把硬件装好S7-1200 CPU和CM CANopen模块是通过模块间U型连接器连接的安装方式就是把模块挂在CPU右侧的导轨上模块之间自然连接。然后在TIA Portal里组态我用的是TIA Portal V15.1步骤大致如下创建新项目添加S7-1200 CPU在设备视图里从右侧硬件目录中找到“通信模块”下的CM CANopen模块拖到CPU右侧的槽位上。如果硬件目录里没有CM CANopen模块说明你安装的TIA Portal版本缺少对应的GSD文件或者硬件支持包需要去西门子官网下载对应的HSP硬件支持包或者GSD文件在“选项”菜单里安装。这一步卡的非常多我见过不少新同事装完TIA Portal打开发现模块库里空空如也其实就是缺HSP。组态CM CANopen模块的网络参数。在模块属性里可以设置模块在PROFINET网络中的设备名称和IP地址这个IP地址是给模块自身的诊断口用的同时设置CANopen主站的参数节点ID、波特率等。波特率建议设为500kbps或者1Mbps和KINCO驱动器保持完全一致。如果现场干扰严重可以降速到250kbps但伺服控制周期会受影响一般不建议。在CM CANopen模块的组态界面里添加从站设备。从站设备通过导入每个从站的EDS文件来添加。KINCO伺服驱动器的EDS文件需要从KINCO官网技术支持下下载或者联系技术支持获取。导入方式是在CM模块的属性窗口中选择“CANopen从站”右键“添加设备”选择EDS文件即可。这里有个特别重要的坑EDS文件版本和驱动器固件版本要匹配。如果驱动器固件升级了还继续用旧EDS文件可能会出现对象字典里的索引对不上读写参数时找错地址这问题极其隐蔽。我建议每次做项目之前都先确认驱动器固件版本再到官网下载对应版本的EDS文件别偷懒用旧的。2.2 KINCO驱动器侧的参数设置KINCO伺服驱动器的CANopen参数一般是藏在驱动器参数组里的不在面板首页需要通过驱动器的操作面板或者调试软件设置。核心参数有以下几个参数项设置值说明站地址Node ID1-127和组态一致每个从站必须唯一波特率500kbps和主站一致必须匹配CANopen协议使能使能部分驱动器默认走Modbus控制方式速度模式或位置模式根据工艺需求选择Node ID设置是很容易出问题的地方。KINCO驱动器上设置Node ID的方式不同系列不一样有的用参数设有的用面板配合拨码开关还有的必须在断电状态下修改才生效。我之前就吃过亏在驱动器面板上改了站地址没断电重启结果怎么刷新总线都找不到这个从站折腾了很久才发现改完站地址必须断电重新上电才生效。强烈建议拿到新驱动器后第一件事就是把Node ID和波特率设对然后在总线上扫描确认能发现设备再往下做映射。还有一点必须提醒如果KINCO驱动器之前被配置成使用其他协议比如Modbus或者脉冲模式接到CANopen总线上之后控制方式不切换过来伺服是不会响应PDO控制字的。具体操作方式是在驱动器参数里把控制源设置为CANopen有的系列叫“控制模式”有的叫“指令源选择”不统一看手册就好。2.3 通信参数匹配的底层逻辑CANopen通信能建立起来最底层的要求就是所有节点的波特率一致、站地址不冲突。这跟一群人开会一样说的语言得一样而且每个人都有唯一的编号不然现场乱套。波特率不匹配的表现是主站能扫描到设备但通信状态一直预操作或者设备干脆就掉线了。站地址冲突则更烦两个设备抢同一个地址主站这边一会能通信一会又报错这种问题用万用表量不出来只能逐台检查。在CM CANopen模块和KINCO伺服通信中还有一个特别容易忽略的点CANopen网络里必须有主站来管理网络状态。CM CANopen模块作为主站会自动管理从站节点的状态切换从站上电以后默认是Initialization状态主站发命令让它进入Pre-operational再进入Operational。如果主站没把从站切到Operational伺服电机是不会响应任何PDO指令的。很多初学者遇到“控制字发了无数遍伺服就是不动”时第一反应是程序错了其实往往是节点没有进入Operational状态这是CANopen的基本机制也是大家必须理解的协议基础。3. PDO机制详解与完整映射表3.1 SDO和PDO搞懂这两个概念才能玩转CANopenCANopen协议里有两种数据交换方式SDO和PDO。把SDO理解成两个人打电话一句话一问一答可靠但慢适合传输偶发的配置参数比如修改加速时间、读取报警代码PDO理解成广播电台发送方不停往外发数据接收方按需收取速度快而且不需要应答适合传输实时控制数据比如控制字、目标速度、实际位置。伺服实时控制必须用PDO因为控制周期通常是1ms或者几毫秒如果用SDO一问一答光握手就开始丢周期了。CM CANopen模块和KINCO伺服之间的数据交互核心就是配置好PDO映射把需要实时交换的参数映射到PDO报文里主站和从站按照固定的映射关系收发数据。PDO又分RPDO和TPDORPDO是接收PDO对伺服来说就是主站发给伺服的命令数据TPDO是发送PDO对伺服来说就是伺服反馈给主站的状态数据。在S7-1200里CM模块负责管理这些PDO的收发PLC程序只需要读写模块对应的I/O地址区数据就自动通过CANopen总线传输过去了。3.2 完整PDO映射表下面是我在一个实际项目里验证过的PDO映射配置控制方式为标准DS402速度模式对象字典6060h设为2或3取决于驱动器支持的是速度模式还是速度位置模式。这个项目里KINCO伺服用来驱动一个传送带要求响应快、运行平稳同时需要监视实际速度。RPDO1主站到伺服方向PLC → KINCO伺服映射序号对象字典索引子索引参数名称数据类型字节长度说明16040h00h控制字ControlwordUINT162控制伺服使能、运行、停止260FFh00h目标速度Target VelocityINT324速度设定值单位取决于6091h设置36081h00h轮廓速度Profile VelocityUINT324加减速曲线中的最大速度46083h00h轮廓加速度Profile AccelerationUINT324加速斜率RPDO总长度14字节传输类型设为同步循环模式Cyclic Synchronous。TPDO1从站到主站方向KINCO伺服 → PLC映射序号对象字典索引子索引参数名称数据类型字节长度说明16041h00h状态字StatuswordUINT162伺服状态反馈2606Ch00h实际速度Actual VelocityINT324反馈速度值36064h00h实际位置Actual PositionINT324反馈位置值41000h00h设备类型Device TypeUINT324可选用于确认设备身份TPDO总长度14字节传输类型设为同步循环模式。在CM CANopen模块的组态界面里输入这些映射时核心操作是把对象字典项“拖进”PDO映射列表。注意映射条目的顺序必须和伺服驱动器中配置的RPDO/TPDO映射顺序一致否则数据会错位。举例来说如果PLC侧映射表里第一个参数是控制字但伺服驱动器侧映射的第一个参数是目标速度那控制字就发到速度的地址里了最典型的表现是控制字和速度值在变量监视表里互相串位。我排查过几次这种问题都是因为映射顺序不一致非常隐蔽。3.3 映射参数的细节计算与COB-ID内幕PDO映射看着简单其实背后有一套详细规则。每一个映射条目Mapping Entry在对象字典里用32位数据表示格式是最高16位是对象索引接着8位是子索引最低8位是位长度。比如0x60400010这个值拆开来看是0x6040 → 对象字典索引6040h对应控制字00 → 子索引0010 → 十六进制等于十进制16代表16位这个计算看起来繁琐但组态软件和EDS文件会自动帮你生成你只需要选择对象字典条目软件自动计算映射值。但你需要理解这个机制因为当你要手动添加一个EDS文件里没有的自定义对象时就得自己输入这个32位的映射值了。我在调试的时候遇到过KINCO驱动器固件版本不支持某些映射项的情况当时就是手动算映射值填进去的搞懂了16位索引8位子索引8位长度的结构手动填也没那么可怕。COB-ID是CANopen里另一组关键数值。CANopen的报文头是COB-ID它决定了这条报文的优先级和类型。对于PDOCOB-ID的计算规则是基础ID加节点地址。默认情况下TPDO1的COB-ID是0x180加Node IDRPDO1的COB-ID是0x200加Node ID。比如Node ID是3那TPDO1的COB-ID就是0x183RPDO1就是0x203。这组数值在组态时是自动生成的但调试时如果用手持监视器抓CANopen报文就得会算这个COB-ID来判断是哪台设备发的哪条PDO。COB-ID的冲突问题也值得一提。如果总线上有两台节点ID不同的设备它们的COB-ID就是各自独立的没问题。但如果你试图把两台设备设成同一个Node ID它们的PDO就完全冲突了总线立刻混乱。排除这类问题时优先检查所有从站的Node ID是否唯一。4. PLC程序编写与数据交互4.1 把PDO数据映射到PLC变量CM CANopen模块和PLC CPU之间的数据交换是通过I/O地址区实现的不需要调用特殊功能块。在TIA Portal组态完成并编译下载后CM CANopen模块会占用一组输入地址和输出地址输出区对应RPDOPLC发送给伺服的命令输入区对应TPDO伺服反馈给PLC的状态。为了提高程序可读性我通常会建一个全局数据块把所有伺服控制数据定义为结构体变量然后在程序里用MOVE指令把模块的I/O地址数据传输到数据块里。以我做过的项目为例CM模块的RPDO输出地址从QB20开始TPDO输入地址从IB32开始那对应的数据块结构体可以建得像这样以SCL语言为例// 定义结构体类型 TYPE KINCO_IF VERSION : 0.1 STRUCT ctrl_word : UInt; // 控制字对应映射的第1个参数 target_velocity : DInt; // 目标速度对应映射的第2个参数 profile_velocity : DWord; // 轮廓速度对应映射的第3个参数 profile_accel : DWord; // 轮廓加速度对应映射的第4个参数 END_STRUCT; END_TYPE // 在OB1里做数据搬运 #temp_cmd.ctrl_word : %QB20; // 读模块输出区 #temp_cmd.target_velocity : %QD22; // 注意地址偏移地址偏移的计算依据是每个数据的字节长度控制字占2个字节在偏移0位置目标速度占4个字节在偏移2位置轮廓速度占4个字节偏移6轮廓加速度占4个字节偏移10。这些偏移值和组态时的映射顺序一一对应一定要仔细算清楚。4.2 DS402状态机的控制字操作标准DS402规定伺服驱动器从待机到正常运行必须经过特定的状态转换每一环节对应不同的控制字数值。实际应用中很多人图省事在上电后直接往控制字里写0x000F试图一次性使能往往会失败因为驱动器状态机要求按顺序走完以下步骤目标状态控制字动作说明上电初始化0x0000清除故障驱动器静止禁止运行0x0006解锁驱动器功率级待机状态0x0007进入Ready To Switch On运行状态0x000F使能伺服开始响应速度指令每一步之间需要检查状态字的对应位。最简单的方式是执行完一步后延时50-100ms再执行下一步虽然不够严谨但实际项目里够用。要想做得规范就得读取状态字6064h/6041h并判断状态位。控制字0x000F发送成功后状态字对应位会显示运行状态已激活此时再写目标速度值电机就会动了。这里还有一个极其常见的问题使能是成功了但电机不转。我遇到过一个项目控制字已经0x000F状态字也正常速度设定值写了1000电机纹丝不动。后来查了半天发现是驱动器的运行模式设置成了位置模式速度指令根本不生效。确保KINCO伺服工作在速度模式对象字典6060h等于2或3而不是默认的位置模式是通信调试的一项核心检查。4.3 PLC程序中的通信超时处理伺服通信和普通工业通信一样最怕总线突然断开。如果CANopen总线通信中断CM模块会在一定时间内检测到总线错误PLC侧可以通过诊断中断或者轮询模块状态位来感知。我在编写控制逻辑时会额外加一个通信看门狗PLC里用定时器每100ms检查一次从伺服返回的状态字是否更新。如果超过500ms状态字没有变化程序立刻减速停机避免伺服在失控状态下继续运行。这个逻辑虽然简单但能避免很多意外情况比如总线被干扰导致通信短暂中断而此时伺服的使能信号还是保持状态、电机还在高速运行一旦通信恢复速度指令突变后果不敢想。通信超时具体怎么实现可以把状态字读回来之后做一次比较存到临时变量里下一轮循环再比较如果两次值相同就计数加一超过N次就判定为通信超时。不必用特殊功能块普通梯形图或SCL都能实现。5. 调试排障与常见问题实录5.1 我从现场抓到的几个典型故障这个题目下真的是各种坑都让我踩遍了。下面是我在实际项目中遇到过最多的问题以及对应的排查思路现象可能原因排查方法和解决办法主站扫描不到从站波特率不一致、Node ID冲突逐一核对主站和所有从站的波特率、站地址确保从站地址不重复能进入Operational但伺服不动驱动器控制源未切到CANopen检查驱动器参数把控制源改为CANopen确认模式是速度/位置PDO数据错位映射顺序不一致对比主站组态和驱动器侧PDO映射顺序确保完全一致通信偶发中断终端电阻缺失、屏蔽层未接地、CAN线走线靠近动力线测量两端电阻约60欧两个120欧并联检查接地和布线SDO读写超时EDS版本和固件不匹配、从站地址错误更新EDS文件重新核对Node ID控制字使能没反应状态机未按顺序执行检查状态字当前状态按DS402规定的顺序逐级使能电机速度波动异常PDO映射速度单位不对、6091h齿轮比未设确认速度单位调整电子齿轮比或速度换算系数5.2 物理层的排查是效率第一优先总线起不来的时候很多人第一个想法是检查参数配置其实90%的通信问题都在物理层。我自己的排查顺序永远是先用万用表量CAN_H和CAN_L之间的电阻正常情况应该在60欧左右总线两端120欧电阻并联的结果如果量出来是120欧说明只有一端有终端电阻补上另一端如果量出来是几欧或者开路那就要查接线和终端电阻了。再拿示波器看CAN_H和CAN_L的波形看信号电平是否在标准范围内CAN_H对CAN_L的差分电平至少要达到2V才对。没有示波器也行用万用表在总线空闲时量CAN_H和CAN_L之间的电压差数值应该在0V左右通信时会有跳变但跳变用万用表看不出来只能大概判断通断。现场最头疼的是通信偶发中断这种问题多半是布线引起的。CAN线太靠近变频器或者伺服驱动器的动力线高频干扰通过耦合进入CAN总线屏蔽层没有接地或者接地多点形成地环路中间用了质量很差的延长线线径太细。这些问题排查起来非常耗时建议设计阶段就做好强电弱电分离CAN线走独立线槽屏蔽层单端接到机柜接地铜排。我后来做项目全部用预制好的CANopen总线电缆带120欧终端电阻的总线连接器现场故障率直线下降。5.3 调试软件的用法和诊断思路KINCO伺服驱动器配套的调试软件是必装工具型号不同可能叫Kinco Servo Debugger或者类似名字通过USB转RS232/RS485线连接驱动器。调试软件的功能很强大可以直接查看驱动器的当前状态字、故障历史、对象字典实时值甚至可以在线修改PDO映射。我调CANopen通信用调试软件的主要场景是读取驱动器当前的Node ID和波特率确认和组态一致查看驱动器的PDO映射表和TIA侧组态对照防止映射顺序不一致手动模拟发送控制字测试驱动器能不能响应使能排除PLC程序问题查看故障记录分析历史故障代码。如果PLC程序写好了但伺服不动先别急着怀疑程序用调试软件给伺服发一下控制字0x000F看电机能不能转。如果能转说明驱动器侧没问题问题在PLC和通信链路如果不能转检查驱动器本身的使能条件比如急停信号、限位信号是不是触发了。很多时候电机不动不是通信问题而是急停回路没解除、限位信号常闭触点没闭合这种低级错误每一年都会发生在新人身上排查效率极低。5.4 模块诊断信息的使用CM CANopen模块还有一个非常实用的功能是诊断缓冲区。在TIA Portal里可以打开CM模块的诊断视图查看总线上各从站的通信状态、错误帧数量、最近一次总线错误的详细信息。当通信出问题时先看这里基本能确定是哪个节点、哪一类错误。错误帧计数持续增长说明物理层一定有问题不要再纠结组态去做物理层排查。另一个容易忽略的是模块固件版本。CM CANopen模块的固件版本过低可能存在已知问题西门子官网会定期发布固件更新。我遇到过一次模块和KINCO伺服通信时SDO偶尔超时升级模块固件后问题消失虽然不能完全确定是固件问题但有能力升级时还是尽量保证模块固件为本版本能省掉很多莫名其妙的坑。6. 从项目角度总结几点实在的体会做个项目最重要的是先搞清楚自己的需求要控制几台伺服每台伺服需要交换几个参数控制周期是多快这些决定了你选择哪种通信方式、用多少PDO映射条目。S7-1200加CM CANopen配合KINCO伺服这套方案最适合的是中小型设备伺服数量在几台到十几台、控制周期在几毫秒量级的场合。如果伺服很多而且需要高速同步插补那还是老老实实上PROFINET或者直接上运动控制器CANopen的带宽上限摆在那里别硬扛。调试顺序上我个人的习惯是先硬件后软件先单机后联调。每台伺服上电后先用调试软件单独确认CANopen通信正常再挂到总线上统一管理。我见过最典型的反面案例是把全部伺服一次性挂到总线上结果通信一塌糊涂分不清到底是谁的问题。老老实实一台一台往上挂每挂一台确认通信正常再挂下一台看着慢实际上总耗时最短。PDO映射表值得单独备份存档。项目结束以后把每个轴的PDO映射表、Node ID、波特率、KINCO驱动器的参数备份文件、TIA项目文件全部归档下次做类似项目直接参考能省下大量重新摸索的时间。我手头几个项目的映射表基本就是同一套模板稍作修改出问题的概率很低。