小米微电机PLC控制实例

硬件配置

  • 区分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;








其他部分细节不在做意义讲述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Envis_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值