硬件配置
- 区分CAN_H和CAN_L
- 电机接头侧下方是CAN_H
- 电机接头侧上方是CAN_L
- 通讯方式只支持CAN2.0B报文,PLC报文发送器选择台达AS228T-A控制器
- 近臂侧小米微电机CAN_ID:=5
- 边缘侧小米微电机CAN_ID:=6
CAN2.0B扩展帧格式
PLC上使用的CAN指令
S1:16#0100 | CAN2.0B扩展报文 | 主站模式,传送后等待接收 | 确定扩展帧和数据帧格式 |
S2:MsgID | ARRAY [0..1] OF WORD | MsgID[0]=16#[ID1,ID2]=16#[01,05] | MsgID[1]:=16#[功能,补充] |
S3: | 数据长度 | 固定长度:8 | |
S4 | SendDate | ARRAY [0..7] OF WORD | 一起是8个word数据 |
D1 | RcvDate | ARRAY [0..10] OF WORD | [0]:MsgID_Lo;[1]:MsgID_Hi;[2]:DateLength;[3]~~[10]:8个数据 |
D2 | CANDone | 通讯完成 | |
D3 | CANErr | 通讯失败 |
MsgID[0]=16#[ID1,ID2]=16#[01,05]
MsgID[0]=16#[ID1,ID2]=16#[01,06]
MsgID[1]:16#[功能,补充]
功能 | 16#[ID1,ID2] | 16#[功能,补充] | |||||
1 | 设置电机机械零点 | 16#0105 | 16#0600 | SendDate[0]:=1 | |||
2 | 设置电机使能 | 16#0105 | 16#0300 | SendDate=0 | |||
3 | 设置电机急停 | 16#0105 | 16#0400 | SendDate=0 | |||
4 | 写入:JOG | 16#0105 | 16#1200 | Index | SendDate[0]:=16#05 &SendDate[1]:=16#70 | 速度: | SendDate[6]&SendDate[7] |
5 | 写入:零位模式 | 16#0105 | 16#1200 | Index | SendDate[0]:=16#05 &SendDate[1]:=16#70 | SendDate[4]:=16#4 | |
配合使能驱动 | |||||||
6 | 写入:位置模式 | 16#0105 | 16#1200 | Index | SendDate[0]:=16#05 &SendDate[1]:=16#70 | SendDate[4]:=16#1 | |
6-2 | 写入:设置速度 | 16#0105 | 16#1200 | Index | SendDate[0]:=16#17 &SendDate[1]:=16#70 | 速度: | SendDate[6]&SendDate[7] |
6-3 | 写入:设置位置 | 16#0105 | 16#1200 | Index | SendDate[0]:=16#16 &SendDate[1]:=16#70 | 位置: | SendDate[6]&SendDate[7] |
配合使能驱动 | |||||||
7 | 写入:速度模式 | 16#0105 | 16#1200 | Index | SendDate[0]:=16#05 &SendDate[1]:=16#70 | SendDate[4]:=16#2 | |
7-2 | 写入:设置最大电流 | 16#0105 | 16#1200 | Index | SendDate[0]:=16#18 &SendDate[1]:=16#70 | 速度Max: | SendDate[6]&SendDate[7] |
7-3 | 写入:设置速度 | 16#0105 | 16#1200 | Index | SendDate[0]:=16#0A &SendDate[1]:=16#70 | 速度: | SendDate[6]&SendDate[7] |
配合使能驱动 | |||||||
8 | 读取:位置 | 16#0105 | 16#1300 | Index | SendDate[0]:=19#0A &SendDate[1]:=16#70 | ||
10 | 通讯类型2触发 | 16#0105 | 16#1200 | SendDate:=0;用以获取设备状态 | [角度0-1,角速度2-3,力矩4-5,温度6-7] |
数据转换方法
方法1
******
方法2
******
核心控制思路:
- 速度模式下运行JOG控制功能
- 速度模式下运行Home控制功能
- Home完成后直接进入位置模式,之后不允许退出该模式
- 位置模式和速度模式的速度固定,不允许设置
位置模式速度值&位置模式位置值
浮点数 | 5.0 | DWord | 16#40A0_0000 | SendDate[6]&SendDate[7]=[A0,40] |
Tip注意事项
CANRS通讯指令在通讯故障时到进入下一次通讯请求时
需要将接收端的数据清空,以保障通讯中接收数据的稳定
代码部分
MainCAN:=16#0001;
CyberGear1.ID:=16#0005;
CyberGear2.ID:=16#0006;
IF State=0 THEN
State:=1;
//CANStart:=1;
END_IF;
//速度控制
CyberGear1.SetSpeed:=CanSpeed;
FB_1(PV := CyberGear1.SetSpeed , OUT1 => RunSpeed2[0] , OUT2 => RunSpeed2[1]);
FB_3(PV := 0.8 , OUT1 => HomeSpeed1[0] , OUT2 => HomeSpeed1[1]);
FB_4(PV := -0.8 , OUT1 => HomeSpeed2[0] , OUT2 => HomeSpeed2[1]);
FB_5(PV := 0.5 , OUT1 => Apei[0] , OUT2 => Apei[1]);
FB_6(PV := CyberGear1.SetPos , OUT1 => AbsPos1[0] , OUT2 => AbsPos1[1]);
FB_2(PV := CyberGear2.SetPos , OUT1 => AbsPos2[0] , OUT2 => AbsPos2[1]);
//IF CANStart THEN
//CANRS( 16#0100 , MsgID , 8 , SendDate , RcvDate , Done , Err );
//END_IF;
CASE State OF
1: //获取设备信息:[角度0-1,角速度2-3,力矩4-5,温度6-7]
IF CyberGear1.StatuExe AND NOT CyberGear1.JOG AND NOT CyberGear1.JOGStop THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0600;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0000;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CyberGear1.StatuExe:=0;
CANDone:=0;
CANStart:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
MOVB( CANRcvDate[3].0 , 8 , CyberGear1.CurPosBuff.8 );
MOVB( CANRcvDate[4].0 , 8 , CyberGear1.CurPosBuff.0 );
State:=2;
ELSIF CANErr THEN
CANErr:=0;
CANStart:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=1;
END_IF;
ELSE
State:=2;
END_IF;
2: //设置速度模式
IF CyberGear1.Mode1 THEN
CyberGear1.PowerDone:=0;
CyberGear1.SpeedMode:=0;
CyberGear1.PositionMode:=0;
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0005;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0002;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=3;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=2;
END_IF;
ELSE
State:=3;
END_IF;
3: //使能
IF CyberGear1.Mode1 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0300;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0000;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CyberGear1.PowerDone:=1;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=4;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=3;
END_IF;
ELSE
State:=4;
END_IF;
4: //限制电流
IF CyberGear1.Mode1 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0018;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=Apei[0];
CANSendDate[7]:=Apei[1];
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CyberGear1.SpeedMode:=1;
CyberGear1.PowerDone:=1;
CyberGear1.Mode1:=0;
CANDone:=0;
CANInitDone:=1;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=5;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=4;
END_IF;
ELSE
State:=5;
END_IF;
5: //JOG~~~~ 速度模式控制区域
IF CyberGear1.JOG AND CyberGear1.SpeedMode THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#000A;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
IF CyberGear1.JOG1 THEN
CANSendDate[6]:=HomeSpeed1[0];
CANSendDate[7]:=HomeSpeed1[1];
ELSIF CyberGear1.JOG2 THEN
CANSendDate[6]:=HomeSpeed2[0];
CANSendDate[7]:=HomeSpeed2[1];
END_IF;
CANStart:=1;//启动通讯
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=6;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=6;
END_IF;
ELSIF CyberGear1.JOGStop AND CyberGear1.SpeedMode THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#000A;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;//启动通讯
IF CANDone THEN
CANStart:=0;
StopCount:=StopCount+1;
IF StopCount>10 THEN
CyberGear1.JOGStop:=0;
StopCount:=0;
END_IF;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=6;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=6;
END_IF;
ELSE
State:=6;
END_IF;
6: //设置机械零点
IF CyberGear1.SetAbsPos0 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0600;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0001;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
CyberGear1.SetAbsPos0:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=7;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=6;
END_IF;
ELSE
State:=7;
END_IF;
7: //设置位置模式
IF CyberGear1.Mode2 THEN
CyberGear1.PowerDone:=0;
CyberGear1.SpeedMode:=0;
CyberGear1.PositionMode:=0;
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0005;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0001;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=8;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=7;
END_IF;
ELSE
State:=8;
END_IF;
8: //使能
IF CyberGear1.Mode2 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0300;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0000;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
CyberGear1.PositionMode:=1;
CyberGear1.Mode2:=0;
CyberGear1.PowerDone:=1;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=9;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=8;
END_IF;
ELSE
State:=9;
END_IF;
9: //设置位置模式的速度
IF CyberGear1.PositionMode AND CyberGear1.AbsStart THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0017;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0002;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=RunSpeed2[0];
CANSendDate[7]:=RunSpeed2[1];
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=10;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=9;
END_IF;
ELSE
State:=10;
END_IF;
10: //设置位置模式的位置
IF CyberGear1.PositionMode AND CyberGear1.AbsStart THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0016;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=AbsPos1[0];
CANSendDate[7]:=AbsPos1[1];
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=11;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=10;
END_IF;
ELSE
State:=11;
END_IF;
11:
State:=99;
///
99:
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANRcvDate[0]:=16#0000;
CANRcvDate[1]:=16#0000;
CANRcvDate[2]:=16#0000;
CANRcvDate[3]:=16#0000;
CANRcvDate[4]:=16#0000;
CANRcvDate[5]:=16#0000;
CANRcvDate[6]:=16#0000;
CANRcvDate[7]:=16#0000;
CANRcvDate[8]:=16#0000;
CANRcvDate[9]:=16#0000;
CANRcvDate[10]:=16#0000;
State:=101;
101: //获取设备信息:[角度0-1,角速度2-3,力矩4-5,温度6-7]
IF CyberGear2.StatuExe AND NOT CyberGear2.JOG AND NOT CyberGear2.JOGStop THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0600;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0000;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CyberGear2.StatuExe:=0;
CANDone:=0;
CANStart:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
MOVB( CANRcvDate[3].0 , 8 , CyberGear2.CurPosBuff.8 );
MOVB( CANRcvDate[4].0 , 8 , CyberGear2.CurPosBuff.0 );
State:=102;
ELSIF CANErr THEN
CANErr:=0;
CANStart:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=101;
END_IF;
ELSE
State:=102;
END_IF;
102: //设置速度模式
IF CyberGear2.Mode1 THEN
CyberGear2.PowerDone:=0;
CyberGear2.SpeedMode:=0;
CyberGear2.PositionMode:=0;
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0005;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0002;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=103;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=102;
END_IF;
ELSE
State:=103;
END_IF;
103: //使能
IF CyberGear2.Mode1 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0300;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0000;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CyberGear2.PowerDone:=1;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=104;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=103;
END_IF;
ELSE
State:=104;
END_IF;
104: //限制电流
IF CyberGear2.Mode1 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0018;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=Apei[0];
CANSendDate[7]:=Apei[1];
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CyberGear2.SpeedMode:=1;
CyberGear2.PowerDone:=1;
CyberGear2.Mode1:=0;
CANDone:=0;
CANInitDone:=1;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=105;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=104;
END_IF;
ELSE
State:=105;
END_IF;
105: //JOG~~~~ 速度模式控制区域
IF CyberGear2.JOG AND CyberGear2.SpeedMode THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#000A;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
IF CyberGear2.JOG1 THEN
CANSendDate[6]:=HomeSpeed2[0];
CANSendDate[7]:=HomeSpeed2[1];
ELSIF CyberGear2.JOG2 THEN
CANSendDate[6]:=HomeSpeed1[0];
CANSendDate[7]:=HomeSpeed1[1];
END_IF;
CANStart:=1;//启动通讯
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=106;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=106;
END_IF;
ELSIF CyberGear2.JOGStop AND CyberGear2.SpeedMode THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#000A;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;//启动通讯
IF CANDone THEN
CANStart:=0;
StopCount:=StopCount+1;
IF StopCount>10 THEN
CyberGear2.JOGStop:=0;
StopCount:=0;
END_IF;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=106;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=106;
END_IF;
ELSE
State:=106;
END_IF;
106: //设置机械零点
IF CyberGear2.SetAbsPos0 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0600;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0001;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
CyberGear2.SetAbsPos0:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=107;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=106;
END_IF;
ELSE
State:=107;
END_IF;
107: //设置位置模式
IF CyberGear2.Mode2 THEN
CyberGear2.PowerDone:=0;
CyberGear2.SpeedMode:=0;
CyberGear2.PositionMode:=0;
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0005;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0001;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=108;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=107;
END_IF;
ELSE
State:=108;
END_IF;
108: //使能
IF CyberGear2.Mode2 THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#0300;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0000;
CANSendDate[1]:=16#0000;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=16#0000;
CANSendDate[7]:=16#0000;
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
CyberGear2.PositionMode:=1;
CyberGear2.Mode2:=0;
CyberGear2.PowerDone:=1;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=109;
ELSIF CANErr THEN
CANStart:=0;
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=108;
END_IF;
ELSE
State:=109;
END_IF;
109: //设置位置模式的速度
IF CyberGear2.PositionMode AND CyberGear2.AbsStart THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0017;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0002;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=RunSpeed2[0];
CANSendDate[7]:=RunSpeed2[1];
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=110;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=109;
END_IF;
ELSE
State:=110;
END_IF;
110: //设置位置模式的位置
IF CyberGear2.PositionMode AND CyberGear2.AbsStart THEN
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear2.ID.0 , 4 , CANMsgID[0].0 );
CANMsgID[1]:=16#1200;//配置msg.ID_HI,配置功能码
CANSendDate[0]:=16#0016;
CANSendDate[1]:=16#0070;
CANSendDate[2]:=16#0000;
CANSendDate[3]:=16#0000;
CANSendDate[4]:=16#0000;
CANSendDate[5]:=16#0000;
CANSendDate[6]:=AbsPos2[0];
CANSendDate[7]:=AbsPos2[1];
CANStart:=1;
IF CANDone THEN
CANStart:=0;
CANDone:=0;
DoneCount:=DoneCount+1;
ErrCount:=0;
State:=111;
ELSIF CANErr THEN
CANErr:=0;
ErrCount:=ErrCount+1;
DoneCount:=0;
ErrState:=State;
State:=110;
END_IF;
ELSE
State:=111;
END_IF;
111:
MOVB( MainCAN.0 , 4 , CANMsgID[0].8 );
MOVB( CyberGear1.ID.0 , 4 , CANMsgID[0].0 );
CANRcvDate[0]:=16#0000;
CANRcvDate[1]:=16#0000;
CANRcvDate[2]:=16#0000;
CANRcvDate[3]:=16#0000;
CANRcvDate[4]:=16#0000;
CANRcvDate[5]:=16#0000;
CANRcvDate[6]:=16#0000;
CANRcvDate[7]:=16#0000;
CANRcvDate[8]:=16#0000;
CANRcvDate[9]:=16#0000;
CANRcvDate[10]:=16#0000;
State:=999;
999:
State:=1;
ELSE
;
END_CASE;
//通讯故障判断
IF CANMsgID[0]=16#0105 AND CANDone THEN
CyberGear1.CommErr:=FALSE;
ELSIF CANMsgID[0]=16#0105 AND CANErr THEN
CyberGear1.CommErr:=TRUE;
END_IF;
IF CANMsgID[0]=16#0106 AND CANDone THEN
CyberGear2.CommErr:=FALSE;
ELSIF CANMsgID[0]=16#0106 AND CANErr THEN
CyberGear2.CommErr:=TRUE;
END_IF;
其他部分细节不在做意义讲述