工控干货.docx
工控干货工控干货|SMC304运动控制器之间的CAN总线级联方法导语:工控干货|SMC304运动控制器之间的CAN总线级联方法一CAN总线实时令牌网1.CAN总线的特点CAN总线ControllerAreaNet是一种有效支持分布式控制的串行通讯网络。它是由德国Bosch公司为汽车的监测、控制系统而设计,由于其具有卓越的特性及极高的可靠性,后来广泛应用于工业经过监控设备的互连。CAN总线只定义了ISO/OSI模型中的第一层物理层和第二层数据链路层,其物理拓扑如图1所示。CAN总线主要特点有:1采用差分传输,抗干扰性强;2采用短帧构造和CRC校验等检错措施,出错概率低;3采用基于优先权的非破坏性总线仲裁技术,可工作于多主、一对一、一对多及全局播送方式传送接收数据;4通讯间隔随波特率而变,典型值为10km5kb/s、40m1Mb/s。2.令牌总线简介令牌总线网络的逻辑拓扑如图2所示。所有连接在令牌总线上的站点在逻辑上构成一个首尾相连的环,每个站点都知道自己的前导站PS和后继站NS。令牌实际上是一个采用特殊编码的控制帧。网络上只有一个令牌沿逻辑环传递,得到令牌的站才能发送数据,然后把令牌向下传。在正常运行时,令牌按照站点地址的序列号从一个站点传送到另外一个站点。这样,这个令牌实际上是按照逻辑环而不是物理环进展传递。在数字序列的最后一个站点将令牌返回到第一个站点。令牌通讯机制的优点是任何时刻网络中只有一对节点在进展通讯,完全杜绝多节点通讯冲突的情况。二SMC304运动控制器CAN总线令牌网及指令1.雷赛CAN总线令牌网的通讯机制SMC304运动控制器可以通过CAN总线和另外的SMC304运动控制器或者雷赛其他型号的运动控制器连接,形成一个多站点的CAN总线运动控制系统,采用令牌通讯机制实现各站点之间的数据交换。与一般令牌网不同,雷赛CAN总线令牌网中有一个主站,负责令牌传递的治理,防止令牌丧失,以进步通讯的可靠性。在雷赛CAN总线实时令牌网上可以发送4类数据:位、字、双字、浮点类数据。通讯流程如下:第一步,主站按周期将本站的存放器数据表中的数据发送给其它各站点;之后往一个从站发送令牌消息;第二步,从站接收到令牌后,将本站存放器数据表中的数据发送给其它各站点;之后往主站发送释放令牌的消息;第三步,主站接收到一个从站令牌释放消息后,往下一个从站发送令牌消息;然后回到第二步,直到所有站点数据都已经发送完成;第四步,主站周期时间到达后重复以上流程。以上通讯经过都是在BASIC程序后台进展,不需要用户编程治理。用户需要在程序中首先初始化用于数据通讯的存放器数据表,设置通讯周期、介入通讯的节点数和节点号;定义要通讯的数据类型、对端节点号;添加通讯数据完毕标志。然后,根据需要在程序中定时查询本地存放器,即可得到其他节点的数据;定时更新存放器数据表,将新数据自动发送给其他节点。2.雷赛CAN总线令牌网的通讯指令1初始化CAN通讯数据表参数SMCCanRegTableInitshortSMCCanRegTableInit(shortEnable,shortSendMode,shortCycleTime,shortCanIdNum,short*pCanIdList);参数:Enable是否启用存放器表通讯:0-禁用,1-启用SendMode发送方式:0-收到令牌后发送从站,1-周期性发送主站CycleTime周期性发送时间,单位:毫秒CanIdNum对端节点号个数pCanIdList对端节点号列表2添加位类数据到存放器表SMCCanRegTableAddBitshortSMCCanRegTableAddBit(shortCanId,shortRegAddr,shortRegNum,DshortRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegNum对端存放器个数,范围1,32RegValue默认值3添加字类数据到存放器表SMCCanRegTableAddRegshortSMCCanRegTableAddReg(shortCanId,shortRegAddr,shortRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegValue默认值4添加双字类数据到存放器表SMCCanRegTableAddLongshortSMCCanRegTableAddLong(shortCanId,shortRegAddr,longRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegValue默认值5添加浮点类数据到存放器表SMCCanRegTableAddFloatshortSMCCanRegTableAddFloat(shortCanId,shortRegAddr,floatRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegValue默认值6添加完毕标志到存放器表SMCCanRegTableAddEndshortSMCCanRegTableAddEnd(shortCanId);参数:CanId对端节点号7更新存放器表中的位类数据SMCCanRegTableSetBitshortSMCCanRegTableSetBit(shortCanId,shortRegAddr,shortRegNum,longRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegNum对端存放器个数,范围1,32RegValue设置值,每一个Bit位代表一个位存放器的值8更新存放器表中的字类数据SMCCanRegTableSetRegshortSMCCanRegTableSetReg(shortCanId,shortRegAddr,shortRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegValue设置值9更新存放器表中的双字类数据SMCCanRegTableSetLongshortSMCCanRegTableSetLong(shortCanId,shortRegAddr,longRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegValue设置值10更新存放器表中的浮点类数据SMCCanRegTableSetFloatshortSMCCanRegTableSetFloat(shortCanId,shortRegAddr,floatRegValue);参数:CanId对端节点号RegAddr对端存放器地址RegValue设置值三CAN总线级联三台SMC304运动控制器的例程1.例程的硬件设置如图3.1所示,3台SMC304运动控制器通过CAN总线级联。且节点号为ID1的运动控制器的CAN1口连接了6个CANopen总线电机和模块。详见本文上篇:SMC304控制器及CANopen总线产品的应用3台SMC304运动控制器的CAN总线拨码开关设置如下:ID1的拨码开关为:Off,Off,On,Off,Off,On。即:CAN1终端电阻使用、CAN0和CAN1独立使用、CAN0终端电阻使用。ID2的拨码开关为:Off,Off,Off,On,On,Off。即:CAN1终端电阻禁用、CAN0和CAN1短接为一个接口、CAN0终端电阻禁用。ID3的拨码开关为:Off,Off,Off,Off,Off,On。即:CAN1终端电阻禁用、CAN0和CAN1独立使用、CAN0终端电阻使用。2.例程的通讯数据将ID2运动控制器作为主站,ID1、ID3号控制器作为从站。D2每80毫秒向ID1发送一个字类数据;向ID3发送1个一个字类数据,一个浮点类数据。ID1拿到令牌后,向ID2和ID3各发送一个字类数据。ID3拿到令牌后,向ID1发送一个字类数据;向ID2发送1个一个字类数据,一个位类数据4位、一个浮点类数据。3.例程的功能本实验软件功能有:ID1、ID2、ID3号控制器分别向ID2、ID3、ID1号控制器发送一个从011循环变化的整数,使其输出口OUT1OUT11的指示灯以跑马灯方式从左到右、每0.2秒闪烁一次;ID1、ID2、ID3号控制器分别向ID3、ID1、ID2号控制器发送一个从110循环变化的整数,使其输出口OUT10OUT0的指示灯以跑马灯方式从右到左、每0.2秒闪烁一次。以此检测CAN总线令牌网的传送字类数据的通讯速度和可靠性。2ID2号控制器每0.2秒将1个整数和一个浮点数合并为1个浮点数,并发送给ID3号控制器,控制其电机做点位运动。以此检测CAN总线令牌网的传送浮点类数据的可靠性。3ID3号控制器每0.2秒向ID2号控制器发送一个在015之间由小到大变化的、长度为4位的位类数据,一个在1111.56788888.5678之间由小到大变化的浮点类数据。ID1、ID2号控制器在接收字类数据、位类数据、浮点类数据的同时,检查其正确性。4ID1号控制器通过CAN1口控制2个CANopen型步进电机、1个CANopen型混合伺服电机、2个CANopen型IO扩展模块、1个CANopen型AD/DA模块。4.例程的程序清单程序清单1:ID2的程序auto:'本机为ID2,为master。undim*dimCerr1,Cerr2,Ccheckdimstate1,state2dimstate3,state4,statedimdata0,data1,data2,data3dimdata0old,data1olddimd0,d1,d2,d3dimt1,t2,tdimf1,f8dimflag1,flag2constCanID1=1'ID1的节点号为1constCanID2=3'ID2的节点号为3constCanID3=5'ID3的节点号为5setcan(1000,CanID2)'ID2的波特率为1000kcallRegTableInit()'运行子程序RegTableInitflag1=0flag2=0state1=20000state2=30011state3=0state4=-91111.567data0=1f1=1234.5678f8=8888.5678int_enable(1)'中断使能:开timer_start(0,20)'翻开定时器0whiletrueDelay(200)'延时200毫秒ifstate1=20011thenstate1=20000'基数设为20000,只是为了验证传送大数据的准确性elsestate1=state1+1'state1在2000020011之间由小到大变化,200毫秒变一次endififstate2=30000thenstate2=30011elsestate2=state2-1'state2在3001130000之间由大到小变化,200毫秒变一次endififstate4=8888.0thenstate4=-7777.7777state3=1elsestate3=state3+1'state3在116之间由大到小变化,200毫秒变一次state4=state4+1111.12345'state4在-7777.7778889.074之间由小到大变化endififstate4=0then'将state3和state4合并为一个浮点数state=state4+state3*10000elsestate=state4-state3*10000endifSMCCANRegTableSetReg(CanID1,20,state2)'更新发送的数据SMCCANRegTableSetReg(CanID3,20,state1)SMCCanRegTableSetFloat(CanID3,26,state)wendendontimer0:'本机为ID2,50毫秒查寻一次ID1、ID3状态。timer_start(0,50)'翻开定时器0,定时时间为50毫秒d1=modbus_Reg(10)'读本地的存放器,查看控制器ID1的指令d2=d1-20000'd2在011之间由小到大变化ifd2%2=0then'当d2=0、2、4、6、8、10时,SMCWriteOutBit(d2+1,0)'OUT1、OUT3、OUT5、OUT7、OUT9、OUT11的LED亮else'当d2=1、3、5、7、9、11时,SMCWriteOutBit(d2,1)'OUT1、OUT3、OUT5、OUT7、OUT9、OUT11的LED灭endifd1=modbus_Reg(30)'读本地的存放器,查看控制器ID3的指令d3=d1-30000'd3在110之间由大到小变化ifd3%2=0then'当d3=10、8、6、4、2、0时,SMCWriteOutBit(d3,1)'OUT10、OUT8、OUT6、OUT4、OUT2、OUT0的LED灭else'当d3=11、9、7、5、3、1时,SMCWriteOutBit(d3-1,0)'OUT10、OUT8、OUT6、OUT4、OUT2、OUT0的LED亮endifdata0=MODBUS_BIT(30,33)ifflag1=0thenflag1=1'第一次读ID3的位类数据data0old=data0elseifdata0data0oldthen'根据有序数据检查数据传送的准确性ifdata0=data0old+1or(data0=0anddata0old=15)thenelseCerr1=Cerr1+1'ID3的传送的位类数据有错,次数加1print"errordata=",data0,data0oldendifdata0old=data0endifendifdata1=MODBUS_IEEE(36)ifflag2=0thenflag2=1'第一次读ID3的浮点类数据data1old=data1elseifdata1data1oldthen'根据有序数据检查数据传送的准确性ifdata1-(data1old+1110.997)0.001or(data1-f10.001anddata1-f80.001)thenelseCerr2=Cerr2+1'ID3的传送的浮点类数据有错,次数加1print"errordata=",data1,data1oldendifdata1old=data1endifendifCcheck=Ccheck+1endsubRegTableInit()dimCanIdList(2)'定义从站节点号列表CanIdList(0)=1'第一个从站节点号为1CanIdList(1)=5'第二个从站节点号为5SMCCANRegTableInit(1,1,80,2,CanIdList)'初始化存放器表,周期为80毫秒,从站节点数为2SMCCANRegTableAddReg(CanID1,20,0)'添加存放器数据SMCCANRegTableAddReg(CanID3,20,0)SMCCanRegTableAddFloat(CanID3,26,0)SMCCANRegTableAddEnd(CanID1)'存放器数据完毕标志endsub程序清单2:ID3的程序auto:'本机为ID3,为slave。undim*dimCerr1,Cerr2,Ccheckdimstate1,state2dimstate3,state4dimdata0,data1,data2,data3dimd0,d1,d2,d3dimt1,t2,tdimf1,f8dimflag1,flag2dimMaxData,MinDataconstCanID1=1constCanID2=3constCanID3=5MaxData=-1000MinData=9999flag1=0flag2=0state1=20000state2=30011state3=0state4=1111.5678data0=1f1=1234.567f8=8888.567setcan(1000,CanID3)callRegTableInit()int_enable(1)'中断使能:开timer_start(0,20)'翻开定时器SMCSetProfileUnit(0,900,6000,0.2,0.1,900)'设置0号轴速度曲线参数SMCSetsprofile(0,0,0.5)'设置0号轴S段参数whiletrueDelay(200)ifstate1=20011then'state1=20000elsestate1=state1+1endif'和ID2程序一样ifstate2=30000thenstate2=30011elsestate2=state2-1endif'ifstate3=15thenstate3=0elsestate3=state3+1'state3在015之间由小到大变化,200毫秒变一次endififstate4=8888.5678thenstate4=1111.5678elsestate4=state4+1111'state4在1111.56788888.5678之间由小到大变化endifSMCCANRegTableSetReg(CanID1,30,state1)'更新发送的数据SMCCANRegTableSetReg(CanID2,30,state2)SMCCanRegTableSetBit(CanID2,30,4,state3)SMCCanRegTableSetFloat(CanID2,36,state4)data1=MODBUS_IEEE(26)ifdata1=0then'将data1拆分为2个数data0=int(data1/10000)'data0是116之间的一个整数data2=data1-data0*10000'data2是-7777.7778889.074之间的一个浮点数elsedata0=-1*int(data1/10000)-1data2=data1+data0*10000endififdata0=4ordata0=12then'根据data0、data2做点位运动SMCPMoveUnit(0,data2,0)endifwendendontimer0:'本机为ID3,50毫秒查寻一次ID1、ID2状态。timer_start(0,50)d1=modbus_Reg(20)'读本地的存放器,查看控制器ID2的指令d2=d1-20000ifd2%2=0then'和ID2程序一样SMCWriteOutBit(d2+1,0)elseSMCWriteOutBit(d2,1)endifd1=modbus_Reg(10)'读本地的存放器,查看控制器ID1的指令d3=d1-30000ifd3%2=0then'和ID2程序一样SMCWriteOutBit(d3,1)elseSMCWriteOutBit(d3-1,0)endifendsubRegTableInit()SMCCanRegTableInit(1,0,0)'初始化存放器表SMCCanRegTableAddReg(CanID1,30,0)'添加存放器数据SMCCanRegTableAddReg(CanID2,30,0)SMCCanRegTableAddBit(CanID2,30,4,0)'长度为4位的位类数据SMCCanRegTableAddFloat(CanID2,36,0)SMCCanRegTableAddEnd(CanID2)'存放器数据完毕标志endsub程序清单3:ID1的程序auto:'本机为ID1,为slave。undim*dima,b,flag1,flag2,Cerr1,Cerr2,CcheckdimEMoutV0,EMoutV1,EMinV0dimstate1,state2dimd1,d2,d3,d2old,d3olddimt1,t2,t,TmaxTmax=0flag1=0flag2=0constEM1out0=12constEM1out8=20constEM1out5=18constEM1out13=25constEM1in0=16constEM1in8=24constEM2out1=29constEM2out9=37constEM2out6=34constEM2out14=42constEM2in1=33constEM2in9=41constCanID1=1constCanID2=3constCanID3=5setcan(1000,CanID1)callRegTableInit()a=offb=offEMoutV0=0EMoutV1=0EMinV0=0state1=20000state2=30011int_enable(1)'中断使能:开timer_start(0,50)'翻开定时器0timer_start(1,60)'翻开定时器1,控制IO模块run1,canmotor'控制CAN总线电机count=0whiletrueDelay(200)ifstate120011thenstate1=20000elsestate1=state1+1endififstate230000thenstate2=30011elsestate2=state2-1endifSMCCANRegTableSetReg(CanID2,10,state1)'更新发送的数据SMCCANRegTableSetReg(CanID3,10,state2)wendendcanmotor:'控制CANopen电机的子任务'程序略详见本文上篇:SMC304控制器及CANopen总线产品的应用endontimer1:'AD/DA模块控制'程序略endEM32IOControl:'控制IO模块的子任务'程序略endontimer0:'本机为ID1,20+毫秒查寻一次ID2、ID3状态。t1=ticksd1=modbus_Reg(30)'读本地的存放器,查看控制器ID3的指令d2=d1-20000ifflag1=0thenflag1=1'第一次d2old=d2ifd2%2=0thenSMCWriteOutBit(d2+1,0)elseSMCWriteOutBit(d2,1)endifelseifd2d2oldthenifd2=d2old+1or(d2=0andd2old=11)thenifd2%2=0thenSMCWriteOutBit(d2+1,0)elseSMCWriteOutBit(d2,1)endifelseCerr1=Cerr1+1'ID3的传送的数据有错,次数加1print"errordata=",d2,d2oldendifd2old=d2endifendifd1=modbus_Reg(20)'读本地的存放器,查看控制器ID2的指令d3=d1-30000ifflag2=0thenflag2=1'第一次d3old=d3ifd3%2=0thenSMCWriteOutBit(d3,1)elseSMCWriteOutBit(d3-1,0)endifelseifd3d3oldthenifd3=d3old-1or(d3=11andd3old=0)thenifd3%2=0thenSMCWriteOutBit(d3,1)elseSMCWriteOutBit(d3-1,0)endifelseCerr2=Cerr2+1'ID2的传送的数据有错,次数加1print"errordata=",d3,d3oldendifd3old=d3endifendifCcheck=Ccheck+1timer_start(0,20)t2=tickst=t2-t1'测量ontimer0运行时间iftTmaxthenTmax=tprint"maxtime=",t'输出最大运行时间endifendsubRegTableInit()SMCCanRegTableInit(1,0,0)'初始化存放器表SMCCanRegTableAddReg(CanID2,10,0)'添加存放器数SMCCanRegTableAddReg(CanID3,10,0)SMCCanRegTableAddEnd(CanID2)'存放器数据完毕标志endsub5.例程的实验结果三台SMC304运动控制器通过CAN总线令牌网级联,可以实现稳定、可靠的数据交换。该程序测试几十小时,未发现一次通讯错误。传送一个字类数据的平均通讯时间小于5毫秒。由于控制器ID1的工作任务繁重,其负责更新传送数据的timer0的中断任务平均完成时间在35毫秒左右,但最长时间近70毫秒,所以,主站ID2将数据通讯周期定为80毫秒。需要留意,有一种情况是可能发生的:在查询本地存放器时,第i个数据是上一个周期接收到的,第i+1个数据是本次周期接收到的。假如这2个数据是关联数据,如:第i个数据是轴号、第i+1个数据是运动间隔;第j个周期和第j+1个周期传送的数据不同。这时就会发生错误。因此,为防止这种情况发生,可以将这2个关联数据合并为一个数据发送。四结论SMC304运动控制器采用CAN总线令牌网级联,通讯速度快、稳定可靠;可以充分发挥SMC304的轨迹控制的功能,扩大使用沟通伺服电机的数目;控制器控制总线型电机的数目减少,降低了总线控制系统的编程难度。所以,该组网方式在小型消费线上应用非常适宜。总之,使用SMC304运动控制器和CANopen总线步进电机、混合伺服电机及扩展模块,可以充分发挥雷赛公司的上风,大幅提升运动控制系统的性价比。五参考文献 1赵城,张凯.基于CAN总线实时令牌网的设计.微型机与应用,2021年第9期2深圳市雷赛控制技术有限公司.雷赛SMC304-BAS运动控制器用户手册.20193深圳市雷赛控制技术有限公司.雷赛运动控制器SMCBasicStudio使用手册.2019声明:本文内容由企业提供,如涉及版权、机密问题,请及时联络我们删除2737591964,不便之处,敬请谅解!