ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C#上位机搞定EtherCAT运动控制:放弃专用卡,纯软件方案全解析

C#上位机搞定EtherCAT运动控制:放弃专用卡,纯软件方案全解析 1. 为什么我会放弃专用运动控制卡纯软件方案的底气与代价前阵子接手了一个改造项目客户现场是一台三轴点胶设备原方案用的是某品牌的专用运动控制卡加端子板整套下来不便宜而且厂商SDK的文档写得让人头疼底层报错全靠猜。客户提了个需求能不能用现有的工控机直接把三台伺服驱动起来省掉运动控制卡这笔预算说实话放五年前我肯定直接摇头。运动控制这行当专用硬件几乎是标配脉冲卡、总线卡、插补卡一层层堆上去成本高不说还把人绑死在厂商生态里。但这几年EtherCAT总线普及之后情况真的变了。伺服驱动器普遍内置EtherCAT从站接口主站这一侧理论上只要一个标准以太网口就能搞定。也就是说用C#写一个上位机直接走网线发EtherCAT帧完全可以接管三台甚至更多伺服的位置、速度、力矩控制。听起来很诱人对吧但这不代表纯软件方案没有代价。最直接的代价是实时性。专用运动控制卡之所以专是因为板卡上有独立处理器和实时固件运动控制周期可以做到125微秒甚至62.5微秒抖动控制在微秒级。而纯软件方案跑在通用操作系统上Windows的线程调度、网卡中断、驱动栈都会引入不确定性裸奔状态下做到1ms周期、几十微秒抖动已经是极限了。对一些场景——比如高速贴片机、精密磨床——这个数据是不够看的。所以我的判断是纯软件方案适合中低速多轴点位运动、点胶、焊接、简单的轨迹插补、设备改造这类场景对成本敏感、对周期要求没那么极致、又希望能快速二次开发的项目这套方案比买运动控制卡划算得多。如果你做的是纳米级光刻台、超高速飞拍那还是老老实实上专用方案别折腾。这篇文章里我把自己从选型到落地、再到调优和踩坑的完整过程写出来给想走这条路的人一个参考。我用的环境是一台普通i5工控机千兆Intel网卡、三台台达B3伺服内置EtherCAT从站、Visual Studio 2022 C#主站协议栈用的SOEMSimple Open EtherCAT Master经P/Invoke封装调用。先说清楚我不是来卖课或者推荐某个商业库的我只是把实际跑通过的路子摊开讲包括那些让我折腾到凌晨两点的坑。2. EtherCAT不是另一种网口主从机制、FMMU与分布时钟速通很多人第一次接触EtherCAT第一反应是不就是用网线连伺服吗跟普通以太网有什么区别这想法会让后面所有调试都变得很痛苦。EtherCAT虽然物理层用的是标准以太网但它的工作方式完全是另一套逻辑。2.1 一帧数据路过所有从站EtherCAT的报文传递机制普通以太网是端到端通信交换机把数据帧从一个端口转发到另一个端口每个设备只处理发给自己的数据。EtherCAT完全反过来主站发出一帧数据这帧数据会像快递车一样沿着菊花链拓扑从第一个从站路过到最后一个从站再从最后一个从站沿原路返回主站。每个从站只做两件事一是把属于自己的那一段数据原地震荡地读出来或写进去二是把剩下的数据原样转发给下一个从站。因为数据是在每个从站硬件内部以纳秒级延迟处理的不是软件处理的所以整条链路的延迟极小哪怕挂了二三十个伺服周期也能控制在1ms以内。这个过程可以用快递分拣来类比一车包裹沿着站点依次开过去每个站点只拿写着自己名字的那个包裹同时把新包裹放上车其他包裹不动车最后原路回到快递总部。主站就是快递总部从站就是沿途站点FMMU就是包裹上的地址标签。2.2 地址与FMMU从站怎么知道哪段数据是自己的EtherCAT的主站会在配置阶段给每个从站分配一个站地址Auto Increment Address或Configured Station Address然后建立FMMUFieldbus Memory Management Unit映射。FMMU的作用是把从站内部的一块物理内存地址比如伺服对象字典里某个索引映射到EtherCAT报文中的某个逻辑地址位置。你可以在配置的时候把从站1的实际位置值映射到逻辑地址0x1000-0x1003从站2的映射到0x1004-0x1007以此类推。主站发一帧数据这一帧数据里就包含了所有从站的输入输出数据每个从站通过自己的FMMU配置自动找到自己那一段。初学的时候不用把FMMU所有寄存器细节背下来但要理解一个核心思想EtherCAT主站跟伺服交换的数据是在配置阶段就预先编排好的一张共享内存表。2.3 分布时钟DC多轴同步的命根子多轴运动控制最怕的事情是什么是轴A已经到位置了轴B还差一截然后两个轴的时间基准还不一致。如果每个从站用自己的本地时钟总会有微小的晶振偏差跑几分钟就积累出明显的不同步。EtherCAT的解决办法是分布时钟Distributed Clocks, DC。主站在配置阶段选一个参考时钟通常选第一个支持DC的从站然后周期性发送同步报文所有从站不断校准自己的本地时钟让全局时钟偏差保持在纳秒级。这样一来每个伺服都在同一个时间基准上执行位置指令多轴联动才有意义。我在做三轴点胶的时候如果没有配置DC同步能明显看到圆弧轨迹变成麻花——因为三个轴到达目标点的时间戳不一致合成轨迹就歪了。配置DC之后轨迹就平滑了。这部分后面实战还会具体讲。3. C# 上位机工程落地SOEM移植、网卡选型与主站循环了解了EtherCAT的基本机制接下来就是动手。第一步不是写代码而是选型。3.1 主站协议栈选型对比SOEM、SSC、商业库怎么选我列了一张对比表把自己调研过的方案摆出来方案授权方式C#接入难度实时性典型表现适用场景SOEM开源GPL / 商用双许可中等需P/Invoke封装1ms周期稳定抖动几十微秒中小型项目、学习研究IgHLinux开源GPL需跨进程通信配合RT补丁可达亚毫秒级Linux平台、高性能场景CODESYS SoftMotion商业集成C#需网关由运行时保证复杂运动控制、PLC风格编程厂商SDK如倍福TwinCAT商业提供ADS接口极佳工业级正式项目商业EtherCAT库如ACONTIS商业提供.NET封装好预算充足的团队我最终选了SOEM原因有三个一是它够轻核心代码就是C语言的那几个文件逻辑清晰出了问题能自己翻源码二是它在Windows下跑得起来不用为它单独装Linux三是网上资料相对多遇到问题还有地方查。有朋友问为什么不用CODESYS或者TwinCAT答案很简单那是另一个生态不是纯软件上位机方案了。TwinCAT本质上是把Windows变成实时PLC运行环境开发方式也偏向PLC风格不太适合我要做的、以C#为主体的上位机应用。SOEM是纯主站协议栈我可以把EtherCAT通信完全封装成C#类库让业务代码只面对开运动设位置读状态这些接口。3.2 P/Invoke封装把C库包装成C#能用的样子SOEM的核心代码是C语言写的要在C#里调用常规做法是编译成DLL后用P/Invoke声明外部函数。我不建议直接照抄一堆DllImport了事而是将EtherCAT通信封装成一个类比如EtherCatMaster对外暴露Init、Config、SendProcessData、ReceiveProcessData、ReadAxisPosition、WriteAxisTarget等高级接口。SOEM主循环的典型C代码结构长这样// SOEM C 主循环示例 ecx_init(eth0); ec_config_init(FALSE); ec_config_map(IOmap); ec_config_dc(); while (1) { ec_send_processdata(); ec_receive_processdata(EC_TIMEOUTRET); // 用户应用逻辑读写过程数据 }封装到C#以后大概是这个味道// C# 里封装的主站循环逻辑伪代码示意 public class EtherCatMaster { [DllImport(SOEM.dll, CallingConvention CallingConvention.Cdecl)] private static extern int ec_init(string ifname); [DllImport(SOEM.dll, CallingConvention CallingConvention.Cdecl)] private static extern int ec_config_init(bool bUseESI); [DllImport(SOEM.dll, CallingConvention CallingConvention.Cdecl)] private static extern int ec_config_map(byte[] pIOmap); public bool Start(string nicName) { if (ec_init(nicName) 0) return false; if (ec_config_init(FALSE) 0) return false; ec_config_map(ioMap); ec_config_dc(); return true; } public void CyclicTask() { ec_send_processdata(); ec_receive_processdata(EC_TIMEOUTRET); } }P/Invoke封装的时候有两个细节要特别注意一是结构体内存布局要和C侧一致特别是字节对齐不对齐会导致读到错误数据二是字符串和指针类型的转换C#侧尽量用IntPtr操作缓冲区不要用托管数组频繁拷贝。我封装完之后把高频调用路径上的数据都固定在了预分配的缓冲区里GC压力小很多周期也更稳定。3.3 网卡选型与Windows环境配置纯软件方案的隐藏雷区这一步太容易被忽略了。很多人以为随便插个网线就能跑EtherCAT结果半路掉线、周期抖动大到报警然后得出结论纯软件方案不可靠。我实测下来网卡选Intel或Realtek的有线千兆网卡是底线笔记本自带的有线口往往还行USB转千兆网卡尽量别用它的驱动栈和中断路径天然不稳定。配置上有几件事必须做在设备管理器里关闭该网卡的节能以太网Power Saving Mode。关闭允许计算机关闭此设备以节约电源。把网卡驱动里的中断节流Interrupt Moderation关掉或者调整到低延迟模式。给EtherCAT通信单独指定一个物理网口不要和普通上网共用网卡。如果有条件把主站循环线程的CPU亲和性设到某个固定核心上减少线程在核心之间迁移带来的抖动// 把主站线程绑定到较空闲的核心例如核心2 Thread.BeginThreadAffinity(); SetThreadAffinityMask(GetCurrentThread(), (IntPtr)0x04); // 绑定第3个核心这些都是血泪经验后面踩坑部分我会再详细说一次。现在先把主站循环跑起来让从站能从Pre-Op状态进到Safe-Op这一步验证通过说明通信链路没问题。4. 把伺服说懂CiA 402状态机、PDO映射与使能时序EtherCAT负责把数据从一个站搬到另一个站但它不管数据含义。伺服电机怎么转、转到哪、多快转完这些是**应用层协议CiA 402CANopen over EtherCAT的子协议**管的。这也是我做这个项目时最花时间的地方协议栈是通的但伺服就是不动一查状态机切不过去。4.1 CiA 402状态机为什么伺服使能不是点一下就完事伺服驱动器的使能不是PLC里一个BOOL变量那么简单。CiA 402规定了伺服内部必须经过一系列状态迁移从Switch On Disabled到Ready To Switch On再到Switched On最后才是Operation Enabled。每一步都要往**控制字Controlword, 0x6040写入特定值同时读取状态字Statusword, 0x6041**确认迁移成功。你可能会问搞这么麻烦干什么因为伺服内部有硬件使能、抱闸释放、急停状态、故障复位等多个安全环节状态机是为了避免程序一跑电机突然就转的危险情况。切状态机的控制字序列我实际用的一个通用顺序是写0x06Shutdown让驱动器从Switch On Disabled进入Ready To Switch On写0x07Switch On从Ready To Switch On进入Switched On写0x0FEnable Operation从Switched On进入Operation Enabled如果伺服报错或故障需要先写0x80复位故障再回到正常流程。每次写完控制字都必须读回状态字确认别闷头往下写。4.2 PDO与SDO过程数据和控制参数的两种通道EtherCAT访问伺服对象字典有两种方式SDOService Data Object和PDOProcess Data Object。SDO类似HTTP请求一问一答适合配置参数、读取不太频繁的数据。比如你设置伺服的加减速时间、修改电子齿轮比、读取报警记录走SDO没问题。PDO类似UDP推流数据在每一个周期里固定传输用于实时控制。主站把目标位置、目标速度、控制字这几项配置成RxPDO发出去同时把实际位置、实际速度、状态字配置成TxPDO收回来。配置好之后每个周期收发都是定长数据不额外占用总线时间。我的配置思路是所有需要实时交换的数据全部走PDO一次性配置好后续周期跑起来就不改了。SDO只在初始化阶段和故障诊断阶段使用。这样既能保证实时性又避免每个周期都发SDO请求导致总线拥挤。4.3 位置模式CSP的运行配置实战本项目点胶轨迹对位置精度和轨迹平滑度有要求所以用的是周期同步位置模式CSPCyclic Synchronous Position。它的原理是主站每个周期告诉伺服一个目标位置伺服内部的位置环负责跟上这个目标。轨迹插补由主站完成伺服只做跟随。CSP模式下几个关键对象字典项是索引名称说明0x6060Mode of Operation设为8CSP0x6061Mode of Operation Display读回确认模式生效0x607ATarget Position目标位置单位根据电子齿轮设置0x60FFTarget Velocity目标速度CST/CSP下有时用0x6040Controlword控制字0x6041Statusword状态字0x6064Position Actual Value实际位置反馈配置过程大致如下用SDO把0x6060设为8。配置RxPDO包含0x6040控制字和0x607A目标位置。配置TxPDO包含0x6041状态字和0x6064实际位置。完成PDO映射后重新映射并进入OP模式。循环中切换状态机到Operation Enabled然后写目标位置。C#侧的循环逻辑核心就是这几步// 伪代码CSP模式下每周期下发目标位置 if (axis.State CiA402State.OperationEnabled) { pdoData.WriteControlWord(axisNo, 0x0F); // 保持使能 pdoData.WriteTargetPosition(axisNo, targetPos); // 写入目标位置 } else { // 先执行状态机切换 axis.ChangeState(CiA402State.OperationEnabled); }这里有个容易踩的坑CSP模式飘零位置指令时指令值的单位不是毫米而是伺服内部的位置计数单位。你要根据电子齿轮比和机械传动比做转换。比如你用了5:1减速器加20齿同步轮线速度要0.8米每秒那位置增量和速度都得经过完整换算后再发给伺服。换算错了设备就会以离谱的速度猛冲危险得很。5. 实测1ms周期下的同步精度、抖动与调优参数配置全部跑通能转了离转得好还有很长一段路。我把三轴点胶设备实际跑起来之后做了几组测试重点看两件事周期稳定性和多轴同步误差。5.1 测试环境与方法我的测试环境工控机Intel i5-8500T16GB内存Windows 10 LTSC网卡板载Intel I219-LM千兆网口伺服3台台达B3系列主站周期1msEtherCAT同步周期负载单轴点胶头三轴分别控制X/Y/Z如何评估主站周期的稳定性我用了两个手段一是直接看SOEM主站循环的实际耗时——在ec_send_processdata之前记录Stopwatch时间戳再在ec_receive_processdata之后记录一次把差值统计起来。这样能看出上位机侧每个周期是否稳定。二是读取伺服的同步误差状态。台达B3支持读取DC同步偏差如果同步偏差过大运动轨迹会发虚、圆弧不是圆。我读的是对象字典里的同步状态和误差计数具体索引因固件版本而异以伺服手册为准。5.2 实测数据与现象裸奔状态装了系统、装了网卡驱动、没做任何优化下1ms设定周期的实测统计指标实测结果说明最小周期耗时0.3ms某一周期很快完成最大周期耗时4.8ms出现明显毛刺可能被系统调度抢占平均周期耗时0.35ms平均看来还挺好周期抖动σ约120微秒个别周期抖动几百微秒这个数据在单轴点动时看不出问题但在三轴同步插补圆弧时会露馅合成轨迹有明显的一卡一卡感测量圆弧半径误差超过0.3mm某些位置还会触发伺服跟随误差报警。做了前面说的网卡节能关闭、中断调制关闭、线程绑定CPU核心之后数据变成了指标优化后实测说明最大周期耗时1.6ms仍偶发毛刺但频率大幅降低平均周期耗时0.32ms接近硬实时水平周期抖动σ约45微秒可以接受三轴同步误差10微秒满足该设备的工艺要求再把Windows电源计划设为高性能、关闭屏幕自动关闭、用powercfg关掉USB选择性暂停最终最大毛刺被压到了1.4ms左右。对点胶这种工艺段来说这个水平够用了。注意周期毛刺再叠加伺服内部插补实际工件上的轨迹误差已经落在工艺允许范围内。5.3 同步优化的具体参数建议如果你也想把周期稳定性压到一个可接受范围按这个顺序做收益最大关网卡节能收益最大很多时候毛刺就是它引起的。关闭网卡中断节流降低中断合并等待时间。为主站循环线程设置高优先级和CPU亲和性。把进程设为实时优先级ProcessPriorityClass.RealTime注意别把整个系统拖垮。把无关服务尽量关掉特别是Windows Search、Windows Update等后台任务。如果工控机支持考虑在BIOS中关闭C-State和SpeedStep降低CPU频率波动带来的调度延迟。做完这些纯软件方案在Windows上基本就是普通工控机能到达的稳定极限了。如果你的工艺要求比这还高我的建议是直接换Linux RT补丁或者上工业级实时扩展那时候1ms周期下抖动能压到10微秒以内。6. 踩坑实录从伺服不动到整机报警的完整排查链路这一节是真正的实战环节。我这套系统从最开始伺服完全不动到后面稳定跑完一整天的点胶任务中间踩坑无数。挑几个最典型的讲每一个都讲清楚排查思路而不是直接给结论因为排查思路比结论更值钱。6.1 坑一伺服状态卡在Switch On Disabled控制字写了没反应现象主站能连上从站PDO也有数据但往控制字写0x06读回来的状态字纹丝不动。排查过程第一步确认模式是否已正确设置。我用SDO读了0x6060发现还是0无模式。原来初始化时SDO写入失败但代码里没有检查返回值导致后面全部基于错误配置运行。修改后确认模式已经变成8CSP。第二步确认控制字写入地址对不对。我用Wireshark抓包过滤EtherCAT协议检查PDO报文里是否真的包含0x6040这个对象。结果发现RxPDO映射根本没做好控制字数据没有被映射进过程数据写了个寂寞。第三步确认伺服是否处于快速停止激活状态。有些伺服在急停或者抱闸未释放时会拒绝切换状态状态字的bit会给出提示。我查了状态字在急停状态下的位定义发现是抱闸控制逻辑不对导致伺服一直认为自己在急停状态。最终修复重新做PDO映射把0x6040和0x607A正确映射到RxPDO抱闸控制改用伺服的抱闸输出端子配合控制字释放逻辑。这个坑花了我整整一个下午。6.2 坑二跑几分钟后整机报警伺服报同步丢失现象系统刚启动时一切正常跑五六分钟后某台伺服突然报同步错误然后整机急停。排查过程第一步查看伺服报警代码。台达B3报的是同步错误类代码大意是看门狗超时。第二步确认主站循环是否还在跑。我在C#里加了日志发现主站循环被Windows后台任务打断了整整200ms。Windows Search索引服务在后台扫描磁盘导致线程调度被抢占。虽然我设置了线程优先级但服务进程的优先级更高时照样被抢。第三步检查看门狗参数。EtherCAT从站有一个看门狗Watchdog机制如果主站超过设定时间没有收到有效帧从站就会进入错误状态。伺服默认看门狗时间可能很短比如1ms或者2ms主站一旦被抢占从站就判断通信断了。最终修复关掉Windows Search和Update服务把EtherCAT通信进程设置为高优先级同时把从站看门狗时间通过SDO调整到更长比如50ms。这样短暂的主站毛刺不会导致从站立即报警但如果毛刺超过50ms说明系统调度真的出问题了报警反而是好事。这里有一个重要认知看门狗不是越短越好也不是越长越好而是要根据你的主站最坏情况周期来匹配。你主站最坏周期是1.6ms那看门狗设3ms就太紧了设100ms又会让安全问题被掩盖在长时间无响应之后。我最后设了50ms既有缓冲又不会让设备失控太久。6.3 坑三三轴插补时圆弧轨迹歪斜位置反馈正常但轨迹不对现象单轴测试全正常三轴联动走圆弧轨迹总是不圆而且朝向固定一个方向偏。排查过程第一步排除机械误差。用百分表打表机械回程间隙基本可以忽略不是这个问题。第二步怀疑轴映射反了。检查X/Y/Z的坐标方向结果发现Y轴传感器安装方向与逻辑方向相反。改逻辑方向后歪斜消失了一部分。第三步检查DC同步。我前面提到过没配置DC或DC配置错误时各轴的时间基准不一致合成轨迹会发虚。我用伺服的状态字确认了DC同步状态发现两个从站的DC同步开启但参考时钟选错了。修正参考时钟后圆弧轨迹最终变得平滑。最终修复修正Y轴方向重新配置DC参考时钟。这一步的教训是多轴系统里轨迹问题通常不是某一个轴的问题而是轴之间的时序关系问题。排查方向一定要从每个轴自己扩展到轴与轴之间的时间基准。6.4 坑四上位机偶尔蓝屏或网卡驱动崩溃现象运行几小时后系统偶尔蓝屏事件查看器显示网卡驱动超时或重置。排查过程第一步怀疑SOEM的主站循环跟网卡驱动之间有冲突。部分网卡驱动的多缓冲Multi-buffer或接收侧缩放RSS特性会干扰EtherCAT这种高频率、小报文的收发模式。我的解决方向是关掉RSS固定收发队列。第二步检查USB外设干扰。工控机上插着USB鼠标、USB摄像头它们的电源管理会引发系统级中断风暴。我在电源选项里禁用USB选择性暂停后问题频率明显降低。第三步确认网卡驱动版本。老版本驱动在某些芯片上会有已知的稳定性问题。更新到厂商提供的最新正式版驱动后长时间运行蓝屏的问题没有再出现。蓝色屏的根因不是SOEM本身而是高频率网络收发加上系统电源管理不稳定导致的驱动级崩溃。这个问题在专用运动控制卡方案里几乎不存在因为它根本不走系统网卡。要纯软件方案稳定就得把这些底层因素都踩平。7. 扩展思路多轴点位表、视觉定位补偿与何时该回到专用硬件三轴点胶设备稳定跑起来之后我又在这个框架上做了不少扩展。这里聊几个在我看来特别实用的方向给后来者指个路。7.1 多轴扩展EtherCAT加轴几乎不增加总线负担EtherCAT最吸引我的一点是在菊花链拓扑下加一个从站只会增加很小的传输延迟因为从站处理数据是硬件级的不是软件转发。我从三轴扩到五轴主站周期仍然稳稳压在1ms几乎没有性能变化。这意味着你在一开始设计主站循环时完全不用为以后扩轴预留什么昂贵的硬件资源把槽位空着就行后面接线、改配置、加轴都是软件层面的活。多轴点位表的做法也很简单。我维护了一个队列每一项包含X/Y/Z/U/V五个目标位置和速度、等待时间、IO输出等工艺参数。主站循环每周期只做三件事判断当前点是否走完通过实际位置与目标位置的距离差、伺服状态字的到位标志位如果走完从队列取出下一点下发目标位置如果没有走完继续发当前点目标位置这样就实现了一个朴素的Buffered Move机制代码量很少但工艺上足够用。如果你要的是连续轨迹插补CNC那种G代码插补那需要在每周期里把轨迹拆分成微小线段下发保证相邻周期位置指令连续可导否则伺服会一顿一顿。7.2 与视觉定位结合从点位表到简单的视觉伺服点胶设备免不了要加视觉定位。Camera拍到一个工件的偏移量然后把这些偏移补偿到运动指令里。这是视觉伺服里最简单但也最实用的形态视觉标定好像素到物理坐标的映射算出差值叠加到目标位置。我在C#里的做法是用Halcon跑模板匹配拿到工件中心坐标和角度然后做一个仿射变换得到修正后的目标位置再写入CSP模式的目标位置对象。这套流程在纯软件方案里非常顺因为视觉和处理逻辑都在同一台工控机的C#进程里数据不走任何外部总线延迟极低。有一个教训值得提视觉拍照和运动执行最好放在两个独立线程里。拍照可能耗时50到100ms如果放在主站循环线程里会直接导致周期抖动从站可能报警。正确做法是视觉线程算出Offset后用最新值更新一个线程安全的共享变量主站循环只读取这个变量参与位置计算。注意加锁或使用原子操作避免读到半个写入的数据。7.3 什么情况下应该回到专用硬件这个问题我经常被问到我的回答是看你的最坏情况周期要求和安全完整性等级。如果你需要在1ms周期内完成复杂的插补运算比如五轴联动、螺旋插补同时保证最坏情况周期抖动低于50微秒Windows纯软件方案做不到Linux RT IgH也许可以但开发门槛高。这时候专用运动控制卡反而成本更低——因为你的时间成本也是钱。如果你的设备要做功能安全Safety over EtherCAT比如安全停机、双通道监控那更不建议纯软件方案。这不是软件不行的问题而是功能安全本质上需要独立硬件通道和认证软件跑在通用OS上很难过认证。一句话总结对成本敏感、工艺要求中等、开发团队熟悉C#的中小型项目纯软件方案性价比极高对高速高动态、安全等级要求高的场景专用硬件仍然是更合适的选择。最后说一点我个人经验。做完这个项目再回头看真正让我觉得这套路能行的不是SOEM跑通了不是C#调通了而是整个方案的可维护性变好了。客户想改一个轨迹改的是C#代码里的数据表重新编译一个EXE发过去就完事不用再等厂商SDK的文档翻译也不用为了一个点位反复翻运动控制卡的说明书。遇到问题了Wireshark抓包、看伺服状态字、翻SOEM源码自己就能定位个八九不离十。如果说有什么最后想补充的那就是别被纯软件四个字迷惑觉得它省事。它只是省了硬件钱但把实时性、驱动稳定性、多轴同步这些复杂度转移到了软件工程师身上。你需要在动手之前把设备工艺需求、最坏情况周期、扩展空间都想清楚。想清楚了再动手这套方案一定不会让你失望。
返回列表