ARTICLE DETAIL

建站实战干货

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

S7-1200通过CANopen控制KINCO伺服:从PDO映射到状态机实战

2026/10/2 1:47:29 拓冰建站 浏览量
S7-1200通过CANopen控制KINCO伺服:从PDO映射到状态机实战 1. 项目背景与整体思路1.1 为什么是S7-1200 KINCO CM CANopen这套组合我这两年做过好几个现场项目客户用的都是西门子S7-1200去做运动控制但伺服驱动器选型基本都偏向国产性价比高的牌子KINCO步科在其中出现频率相当高。原因也简单KINCO伺服的响应速度、过载能力和调试软件体验在同价位段确实能打尤其在小功率段400W到2kW和日系竞品差距已经不大但价格可能只有一半。不过问题来了S7-1200本体上只有一个Profinet口或者做PN/DP通讯时想带CANopen总线伺服就得靠额外的通讯模块——这就是CM CANopen模块存在的意义。我之前在论坛里看到不少同行问S7-1200能不能直接发CANopen指令给KINCO答案是可以但中间必须经过CM CANopen模块做协议转换。CM CANopen模块本身是一块西门子原装的通讯处理器插在S7-1200左侧扩展总线上CPU通过背板总线和它交换数据而模块对外提供标准的CANopen主站接口。简单理解CPU只需要读写模块里面的数据区CM模块负责把数据打包成CANopen报文发到总线上去。工程师真正要搞明白的其实是怎么把CM模块里那一串输入输出数据和KINCO伺服的对象字典、PDO映射对应起来。1.2 这篇文章能解决什么问题我第一次做这个项目的时候光是让电机动起来就折腾了整整一个下午。不是硬件没接对而是很多人没意识到S7-1200侧的程序编写思路和直接PLC发脉冲完全不一样。你发脉冲控制步进或伺服PLC只管输出脉冲和方向信号就好但走CANopen总线控制你面对的是一个报文—对象字典—PDO映射的完整链条任何一个环节对象索引填错、映射字节顺序不对、同步周期设置不一致都会导致电机不动、报错、甚至飞车。这篇文章的目标就是把这个链条彻底讲透让你拿到手就知道先配什么、再配什么、每个参数的作用是什么。整个内容我会按照我刚做这个项目时的推进顺序来写先理清硬件组态和地址分配的思路然后逐项讲解KINCO伺服端的核心参数配置接着把PDO映射表一张一张拆开讲最后把最常踩的坑和排查方法整理出来。全程用S7-1200 CM CANopen模块配合KINCO FD100系列伺服驱动器的实际案例来讲但很多原理同样适用于其他品牌CANopen伺服。2. 硬件选型与组态配置要点2.1 硬件清单和接线之前必须确认的三件事开始配置之前先确认你手上的硬件型号和版本匹配不然后面排查问题会非常痛苦。第一S7-1200的CPU固件版本。CM CANopen模块要求CPU固件至少V4.0以上如果你的CPU还是老版本建议先在TIA Portal里做在线更新。这是我踩过的一个坑——老板从仓库里翻出一个老CPU固件还是V3.0组态时压根找不到CM CANopen模块后来查手册才发现固件版本不够。第二KINCO伺服驱动器的具体型号。KINCO现在市面上流通较多的是FD100系列这个系列本身支持CANopen通讯但有一个关键点你必须确认驱动器的控制模式被设定为通讯控制或CANopen模式。FD100伺服驱动器通过前面板的四位拨码开关SW1来选择通讯方式出厂默认可能是位置脉冲模式一定要把SW1拨到CANopen档位否则你总线报文发得再对驱动器也不会理你。第三终端电阻。CANopen总线两端必须各接一个120Ω终端电阻这个在短距离、少节点少于5个的场合经常被忽略但一旦通信不稳定、时不时掉站第一个要查的就是它。CM CANopen模块本身集成有终端电阻开关位于模块侧面的DIP开关上KINCO伺服驱动器也有外接终端电阻的接线端子。实测下来两个节点一主一从距离一米也得把两端电阻都接上否则高速通讯1Mbps极容易出现偶发性丢包。2.2 CM CANopen模块在TIA Portal里的组态方法打开TIA Portal创建一个新项目添加你的S7-1200 CPU。然后在左侧硬件目录里找到通讯模块—CM CANopen把它拖到CPU左侧的插槽位置S7-1200的通讯模块只能挂在CPU左边这点和ET200SP的IO模块布局不太一样别拖错位置。模块添加完成后双击CM CANopen模块进入属性设置这里有几个关键点要单独说节点地址默认是1这个地址是作为CANopen主站的地址。如果你现场还有其他CANopen主站设备要避开冲突。波特率建议从125kbps或者250kbps开始调。1Mbps看着快但对布线质量和终端电阻的要求也最高现场调试时经常出现低速稳定跑、高速频繁掉站的尴尬局面。我习惯先把波特率调到250kbps验证链路没问题再决定要不要往上提。同步周期CM CANopen模块支持周期发送SYNC同步报文这个周期决定了PDO数据的刷新节奏。默认是10ms就是每10ms往总线上发一帧同步报文从站收到同步报文后把各自的PDO发上来。如果你的应用对同步性要求不高可以适当放宽到20ms甚至50ms能有效降低总线负载。组态完成后编译下载然后在TIA Portal的设备视图里可以看到CM CANopen模块占据了一段输入/输出地址区。这段地址区就是CPU和模块交换数据的通道后续所有CANopen应用逻辑都围绕这组地址展开。2.3 模块I/O地址和实际CANopen数据的对应关系很多初学者卡在这里CPU上电后模块输入区有一堆字节输出区也有一堆字节但我怎么知道哪几个字节对应伺服的状态字哪几个字节对应实际速度值这就涉及CM CANopen模块的数据结构设计。CM CANopen模块的IO区本质是一个网关缓冲区。CPU往输出区写的字节会被模块按照你在模块属性里配置的PDO映射关系自动打包成CANopen PDO报文发出去模块从总线上收到的PDO报文会自动拆包放入输入区CPU读取输入区就能拿到从站反馈的数据。这个过程听起来简单但实际操作里你必须定义清楚两部分内容发送方向CPU→伺服哪些模块输出区字节作为RPDO接收PDO传给KINCO伺服接收方向伺服→CPU哪些模块输入区字节作为TPDO发送PDO接收KINCO伺服返回的数据这些内容都是在CM CANopen模块属性页里的PDO配置或者S7工程里的CANopen应用接口函数块如T-CANopen指令库里完成的。具体到项目实操下面一节我会完整展开。3. KINCO伺服核心参数配置与PDO映射表3.1 KINCO FD100伺服驱动器CANopen参数设置KINCO伺服驱动的参数设置可以通过前面板按键完成也可以使用KINCO的调试软件如KINCO Servo Studio在线修改。但注意一点和CANopen通信相关的参数很多是掉电保存后重新上电才生效尤其节点ID、波特率、PDO映射这类改完必须断电重启。以FD100系列为例我整理了一份我现场常用的参数清单直接对照设置即可参数号含义推荐值说明Pn-01驱动控制模式根据实际设置为CANopen模式对应的数值Pn-02CANopen节点ID1~127如设为3总线上唯一Pn-03CANopen波特率250kbps和主站一致Pn-04从站心跳周期0或50ms0表示关闭建议打开Pn-05从站看门狗超时100~500ms建议500ms防止意外停机Pn-10电机旋转方向0或1根据机械方向调整Pn-11电子齿轮比分子根据减速比与Pn-12配合Pn-12电子齿轮比分母根据电机编码器通常10000Pn-20位置脉冲模式指令源无需设置CANopen模式下忽略Pn-52PDO enable标志1使能必须开启否则PDO不生效这里特别提醒两点节点ID和波特率在驱动器上电初始化时读取修改后必须完全断电再上电不是面板上按复位是真正切断主电路电源。我遇到过现场师傅说我改了参数也按保存了怎么总线上还找不到设备最后发现他只是让驱动器待机没有断电重启新参数根本没加载。电子齿轮比和PDO速度/位置指令的关系非常紧密。KINCO伺服默认编码器分辨率是2500线即10000脉冲每圈经过4倍频处理这个10000就是你做PDO映射时计算速度值和位置值的基础。如果你希望PDO里发送的目标位置单位是0.01mm假设丝杆导程5mm那么电子齿轮比就要按这个机械关系换算好。换算公式后面我会专门讲。3.2 CiA 402标准对象字典速查既然走CANopen控制伺服就绕不开CiA 402也常叫IEC 61800-7-201这个行业标准。它规定了伺服驱动器的对象字典中哪些索引代表什么功能。不用死记硬背但400W以上伺服项目常见的就那么几个对象我列个速查表索引HEX名称读/写说明0x6040控制字Controlword写启停、使能、急停的关键0x6041状态字Statusword读驱动器当前状态0x6060运行模式Modes of Operation写1位置3速度4转矩0x6061运行模式显示读读取当前模式0x6064实际位置Position Actual Value读单位脉冲或用户单位0x606C实际速度Velocity Actual Value读单位脉冲/s或用户单位0x607A目标位置Target Position写位置模式目标值0x60FF目标速度Target Velocity写速度模式目标值0x6071目标转矩Target Torque写转矩模式目标值0x6081轮廓速度Profile Velocity写用于加减速斜坡0x6083轮廓加速度Profile Acceleration写单位脉冲/s²0x6084轮廓减速度Profile Deceleration写单位脉冲/s²0x6062跟随误差窗口读/写超出范围触发报警这几个对象是PDO映射和SDO读写的地基后面配置PDO时我们其实就是选择性地把这些对象塞进PDO报文里。3.3 PDO映射表的完整配置实例可直接抄作业PDO映射是CANopen配置里最核心、最繁琐的一步。很多工程师对对象字典单个参数不陌生但一看到PDO映射就懵本质原因是映射规则没吃透。PDO映射规则一句话解释比如RPDO1从站接收PDO1里你要发给从站的数据可以自由选择几个对象按顺序排列每个对象在PDO里的数据长度是可以按字节对齐的。映射参数0x1600~0x1603下面是RPDO1~4的映射参数0x1A00~0x1A03是TPDO1~4的映射参数里填的是索引子索引位长度的组合值。下面我给出一个实际项目的完整PDO映射表对应的场景是一条小型装配线S7-1200通过CANopen控制一台KINCO伺服做定位同时需要实时监控伺服速度。RPDO1PLC发给伺服映射到0x1600映射顺序对象索引子索引数据长度说明10x60400x0016位控制字20x607A0x0032位目标位置30x60FF0x0032位目标速度RPDO1总长度 2 4 4 10字节。注意PDO总长度不能超过8字节标准CAN帧数据域上限。哦不对这里就出问题了——24410已经超过8了这就引出一个极其重要的避坑点PDO报文数据长度严格受CAN标准帧8字节限制。一个PDO里最多塞8字节数据超过就要拆分成两个PDO或者精简映射对象。所以正确的做法是拆分成两个PDO这是我在现场常用的方案RPDO1映射到0x1600属于PDO1控制字 目标位置映射顺序对象索引子索引数据长度说明10x60400x0016位控制字20x607A0x0032位目标位置总长度 6字节有效。RPDO2映射到0x1601属于PDO2目标速度映射顺序对象索引子索引数据长度说明10x60FF0x0032位目标速度总长度 4字节有效。TPDO1伺服发给PLC映射到0x1A00状态字 实际位置 实际速度映射顺序对象索引子索引数据长度说明10x60410x0016位状态字20x60640x0032位实际位置30x606C0x0032位实际速度总长度 2 4 4 10字节同样超了。继续拆TPDO1映射到0x1A00状态字 实际位置映射顺序对象索引子索引数据长度说明10x60410x0016位状态字20x60640x0032位实际位置总长度 6字节有效。TPDO2映射到0x1A01实际速度映射顺序对象索引子索引数据长度说明10x606C0x0032位实际速度总长度 4字节有效。3.4 PDO映射参数的具体数值换算有了上面的映射关系还要换算成实际写入KINCO驱动器的映射参数值。每个映射项的格式是bit31~16放对象索引bit15~8放子索引bit7~0放数据长度单位是bit。全部按十六进制拼起来。RPDO1映射参数对应0x1600子索引1和20x1600:01第一个映射项对象6040h子索引00h16位 → 0x604000100x1600:02第二个映射项对象607Ah子索引00h32位 → 0x607A0020RPDO2映射参数对应0x1601子索引10x1601:01对象60FFh子索引00h32位 → 0x60FF0020TPDO1映射参数对应0x1A00子索引1和20x1A00:01对象6041h子索引00h16位 → 0x604100100x1A00:02对象6064h子索引00h32位 → 0x60640020TPDO2映射参数对应0x1A01子索引10x1A01:01对象606Ch子索引00h32位 → 0x606C0020有一点必须提醒每个PDO映射参数的自索引0表示该PDO映射的对象个数比如0x1600:00应该填2表示RPDO1映射了两个对象0x1601:00填10x1A00:00填20x1A01:00填1。这个数值如果忘记设了就算你在子索引1、2里填了映射项从站也不会反正正常发送这个PDO。3.5 用KINCO调试软件写入映射参数的实操步骤KINCO的调试软件Servo Studio或Drive Explorer不同时期叫法不同里通常有一个通讯配置或PDO配置页面。操作步骤大致如下用USB线连接KINCO伺服驱动器打开调试软件选择正确的串口。进入通讯参数页面设置节点ID和波特率确认和主站一致。进入对象字典页面手动修改0x1600、0x1601、0x1A00、0x1A01等映射参数逐个子索引写入。确认0x1600:002、0x1601:001、0x1A00:002、0x1A01:001。确认0x6060运行模式设为1位置模式如果你需要速度控制也可以设为3。保存参数到EEPROM完全断电重启。如果你手上没有调试软件用CANpro或者任意一款CAN分析仪直接通过SDO报文往0x1600等索引里写数据也行但操作繁琐得多而且容易写错地址不太建议新手现场这样干。4. TIA Portal侧的程序编写与数据填充4.1 CM CANopen模块的SDO上传与PDO数据映射S7-1200侧配置CM CANopen模块西门子提供了一个专门的指令库叫CANopen指令库里面有几个核心函数块最常用的就是CANOPEN_SDO和CANOPEN_PDO或者在新版本TIA Portal中集成了类似T CANopen的功能块。使用西门子官方示例库之前需要在TIA Portal中打开全局库把CANopen库文件添加进来如果安装博途时选了对应的软件包。然后在OB100启动组织块里初始化模块设置主站参数。再在OB1循环组织块中调用相关函数块来处理PDO收发。实际CALL这些函数块时要注意CM CANopen模块的输入/输出地址区必须和函数块的引脚对应。比如模块的输入起始地址是IB100那么函数块里对应接收缓冲区的引脚就要填P#I100.0。这个对应关系错了程序逻辑上再正确数据也读不到。4.2 控制字和状态字的状态机配合使用CiA 402标准控制伺服最核心的就是状态机转换。一开始很多人直接把0x6040控制字写成0x000F想直接使能结果发现驱动器没反应原因就是没有先完成状态机的状态跳转。标准的状态机跳转大概是这样的上电初始状态驱动器处于Switch on disabled禁止切换接通写入控制字0x0006Shutdown进入Ready to switch on准备切换接通写入控制字0x0007Switch on进入Switched on已切换接通写入控制字0x000FEnable operation进入Operation enabled运行使能这个过程中每一步最好都要回读0x6041状态字确认当前状态确实已经到位再执行下一步。这和PLC程序里的顺序控制一个思路如果没等状态到位就跳下一步驱动器容易报错或者干脆不动作。我把这段逻辑封装成了一个函数块FB里面用了一个状态字节变量记录当前状态机的步序号然后在OB1里循环调用。关键代码逻辑如下SCL语言CASE step OF 0: // 发送Shutdown命令 Controlword_Data : 16#0006; IF Statusword_Data AND 16#0021 16#0021 THEN step : 1; END_IF; 1: // 发送Switch On命令 Controlword_Data : 16#0007; IF Statusword_Data AND 16#0023 16#0023 THEN step : 2; END_IF; 2: // 发送Enable Operation命令 Controlword_Data : 16#000F; IF Statusword_Data AND 16#0027 16#0027 THEN step : 3; // 已使能 END_IF; 3: // 正常运行保持使能 Controlword_Data : 16#000F; END_CASE;这只是一个简化框架实际项目里还要做报警复位0x0080、暂停0x0102等操作但状态机的骨架就是这样先把使能和停止的链路打通后续功能都是在上面加。控制器使能之后要发目标位置或者目标速度直接往对应的PDO数据区填值就行。S7-1200的数据区里4字节的INT32是按大端字节序还是小端存储这个必须和CANopen总线的字节序对齐。CANopen标准规定PDO中的多字节数据默认是小端模式低字节在前。S7-1200作为小端架构Intel x86兼容存储的INT32本来就是低字节在前所以直接传送即可不需要额外交换字节序——但如果你用的是S7-300/400可能就会遇到高低字节颠倒的坑S7-1200用户反而省了一步。4.3 位置值、速度值的缩放计算这是整个项目里最容易让现场工程师犯迷糊的地方。PDO里发的是用户单位还是脉冲数KINCO伺服的位置对象0x607A目标位置单位默认是脉冲数或者说用户单位取决于0x6091和0x6092的齿轮比设置。在没有改齿轮比的情况下就是编码器反馈的实际脉冲数。假设机械部分是伺服直连丝杆丝杆导程5mm减速比1:1编码器每圈10000脉冲2500线×4倍频那么目标位置脉冲数 目标位移mm / 5mm × 10000例如要让工作台走12.5mm目标位置 12.5 / 5 × 10000 25000脉冲这个25000用十六进制看是0x000061A8直接填入PDO的目标位置数据区。速度类似0x60FF目标速度单位也是脉冲数/秒在没有改速度单位对象0x609C之前。如果希望电机以 300转/分 的速度运行 → 300转/分 5转/秒 → 5×10000 50000脉冲/秒0x6083轮廓加速度单位是脉冲/秒²如果你的加速时间是0.5秒那么加速度 50000/0.5 100000脉冲/秒²这些计算看起来啰嗦但如果不在PDO映射前算清楚到现场按手册调半天电机要么不动要么乱跑你会以为通讯没通其实只是缩放系数错了。4.4 手动/自动模式的切换与安全逻辑实际项目里伺服不可能总让PLC通过CANopen控制。调试阶段或者手动换料时现场师傅经常要用驱动器面板点动。这就需要在PLC程序里加一个手动/自动切换的逻辑。我的建议是驱动器的输入端子不要接任何硬点动信号只保留急停和硬限位。手动点动通过PLC程序实现——按下触摸屏上的点动按钮PLC往PDO里发一个小的目标速度松开后目标速度归零。这样手动自动逻辑全都集中在PLC里排查问题只查一份程序。硬限位信号直接接到伺服驱动器的高速输入端子上配置成正/负硬限位功能这样即使PLC程序出Bug或者通讯卡死伺服也会自己停下来不会把机械撞坏。安全回路永远不依赖通讯链路的可靠性这是一个基本的工程素养。5. 通信联调过程、故障排查与实战心得5.1 上电调试的标准流程当你的KINCO伺服参数设置完成、CM CANopen模块组态完成、PLC程序写完之后真正的联调就开始了。我强烈建议按下面这个顺序做能帮你快速缩小问题范围第一步先不看PLC用CAN分析仪或者KINCO调试软件自带的CAN监控挂在总线上确认驱动器上电后能收到它的启动报文心跳报文是否周期出现。如果看不到驱动器的心跳先查节点ID和波特率再查终端电阻和接线。这一步不要碰PLC先把物理链路和从站本身跑通。第二步用KINCO调试软件往驱动器发一个SDO命令比如把0x6060运行模式设为1然后读回来确认SDO读写完全正常。这能验证CANopen协议栈在驱动器侧是OK的。第三步把CM CANopen模块接入总线在TIA Portal里监控模块状态字确认主站已经进入Operational状态能看到从站心跳。如果主站一直停留在PreOperational说明NMT管理报文没有正常发送或者从站存在节点保护冲突。第四步测试PDO数据。先不发控制字手动在模块输出区填一个目标速度值然后观察TPDO反馈的实际速度是否同步变化。确认双向PDO都通后再执行状态机使能流程。这个流程从下往上、从简单到复杂任何一步卡住了问题范围都能立刻缩小到协议栈、接线、参数配置或者程序逻辑的某一个具体环节。5.2 常见问题速查表这些坑我基本都踩过现象可能原因排查方法总线上完全找不到从站节点ID/波特率设置不一致终端电阻缺失接线错误用CAN分析仪扫描检查拨码开关验证CANH/CANL是否接反心跳正常但PDO没数据PDO映射参数没写全0x1600:00映射数量没设置PDO传输类型配置异常用SDO逐个回读0x1600、0x1A00所有子索引核对映射个数子索引使能指令发了但驱动器不使能控制字状态机没有从Shutdown到Switch On到Enable逐步跳转状态字读取异常监控0x6041实际值手动逐条发控制字并查看状态跳变电机动了但方向反了目标位置符号不对电子齿轮比符号设置错电机相序不对先低速小位移测试再用Pn参数调整方向目标速度值很大但电机几乎不动速度缩放系数错误脉冲/秒算错加速度太小导致斜坡过于平缓检查0x60FF数值是否在合理范围把加速度临时放大测试偶尔丢站或通讯随机中断波特率过高线缆屏蔽层接地不良从站看门狗设置太短降低波特率到250kbps检查屏蔽层单端接地放宽看门狗至500ms写了映射参数但断电丢失没有保存到EEPROM部分型号需要专用保存命令确认调试软件里执行了存储参数操作重启后再回读确认PLC里读到的位置值忽大忽小多字节字节序没有对齐PDO拆包逻辑错误用一个固定位置值回读比对字节顺序是否正确5.3 两个特别容易忽略的细节第一个细节是CM CANopen模块的同步报文周期和KINCO伺服的PDO传输类型必须匹配。KINCO伺服的TPDO默认传输类型可能是异步的event-driven也可以设置为同步synchronous即收到SYNC后发送。如果你在CM模块里设置了周期发送SYNC但KINCO侧TPDO配置的是异步触发那PLC读到的反馈值刷新频率可能不稳定表现为位置值偶尔跳变或速度反馈滞后感明显。解决方法是把KINCO的TPDO传输类型显式设为同步类型传输类型值2~240之间常用1表示每个SYNC周期发送一次。第二个细节是CM CANopen模块和KINCO伺服之间的PDO禁止时间设置。PDO禁止时间Inhibit Time是防止同一个PDO在极短时间内被重复发送而占满总线的保护机制。默认值是0表示不限制。但如果你的PLC循环周期很快比如5ms而同步周期是10ms理论上不会发生冲突。实际遇到底层报文重复发送的问题可以在从站的0x1800子索引2里设置一个禁止时间比如0x64100单位×100µs10ms以保证总线负载平稳。5.4 调试工具和日志分析的实用技巧调试CANopen总线一个好的总线分析工具能省一半的排查时间。我常用的方案有两种一是PCAN-USB适配器加PCAN-View软件二是周立功的USBCAN-II加ZCANPro。如果你用的KINCO调试软件自带CAN监控功能也可以直接用但功能相对简单。收到总线日志后重点看三件事NMT状态切换序列是否完整启动后主站是否发了Start Remote Node0x01命令从站是否回应SDO读写请求和响应是否成对出现有请求没响应基本可以定位到从站对象字典地址或者索引错误PDO发送周期是否和设定的一致如果TPDO的节奏忽快忽慢大概率是传输类型没设置成同步实际调试现场你用日志去倒推原因比盲调快太多了。5.5 从这几次项目里总结的一些实战心得做CANopen不是做普通开关量控制它的调试曲线前期特别陡但一旦把状态机、对象字典、PDO映射这套逻辑理清楚了后面所有CANopen设备对你来说都是同一套思路只是对象索引不同而已。我个人在这个项目里最大的感触是不要一上来就追求1Mbps高速率。工业现场有很多你想不到的干扰源——变频器、开关电源、伺服电机动力线缆——都会在CAN总线上叠加噪声。把速率降到250kbps配合正确接地和终端电阻系统稳定性会有质的提升。另一个心得是PDO映射表一定要写进项目文档。很多设备维护三个月后当初调好的参数被误改了如果没有一份明确的映射表存档排查只能靠猜。我后来习惯在项目交付时附上一份和本文类似的表单标明每个PDO里填的是什么对象、字节顺序怎么排、单位是什么、缩放系数是多少。这样即使换了一个工程师来维护照着表也能很快接手。最后再分享一个实用技巧调试期间在PLC程序里把所有PDO数据区的原始值字节数组形式都做到HMI的监控页面上。这样现场调机时可以直观看到通讯层的数据流动而不是通过一堆通过函数块转换后的工程值去反推问题。等系统稳定了再把这些监控页面删掉不影响最终交付。这招帮我省了好几次到底是通讯断了还是程序算错了的争论时间。