Basic语言开发技巧
正运动控制器支持Basic,PLC编程。PLC编程与三菱PLC梯形图编程相似,而Basic语言开发则跟高级语言开发相似,有任务(高级语言开发里边的线程),最大的区别是程序从上往下扫描一次。
正运动的Hmi的按钮等操作可以直接访问Basic语言里边的全局变量,对气缸,轴的控制,可以使用同一个函数根据不同的参数值来实现。
在编写每个工位自动逻辑时,可以使用数组,建立输入,输出,气缸,轴的数组,在对应的数组里边添加此工位使用的点位,气缸和轴。在编程的时候,使用数组的索引来获取对应的数值,然后再调用气缸、轴控制函数来实现功能,具体的看代码。
GLOBAL system_state '系统状态
GLOBAL system_run '系统运行
GLOBAL system_pause '系统暂停
GLOBAL system_stop '系统停止
'输入点定义
GLOBAL I_Start = 0 '启动
GLOBAL I_Stop = 1 '停止
GLOBAL I_Reset = 2 '复位
GLOBAL I_PushCylInP = 3 '推料气缸到位
GLOBAL I_PushCylInS = 4 '推料气缸原位
GLOBAL I_LiftCylInP = 5 '升降气缸到位
GLOBAL I_LiftCylInS = 6 '升降气缸原位
GLOBAL I_AxisLoadDatum = 7 '上料轴原点
GLOBAL I_AxisLoadFS = 8 '上料轴正极限
GLOBAL I_AxisBlankDatum = 9 '下料轴原点
GLOBAL I_AxisBlankFS = 10 '下料轴正极限
GLOBAL I_AxisLoadAlm = 12 '上料轴报警
GLOBAL I_AxisBlankAlm = 13 '下料轴报警
'输出点定义
GLOBAL O_GreenLight = 0 '绿灯
GLOBAL O_RedLight = 1 '红灯
GLOBAL O_PushCylOutP = 2 '推料气缸推出
GLOBAL O_PushCylOutS = 3 '推料气缸缩回
GLOBAL O_LiftCylOutP = 4 '升降气缸下降
GLOBAL O_AxisLoadEn = 10 '上料轴使能
GLOBAL O_AxisBlankEn = 11 '下料轴使能
'气缸定义
GLOBAL Cyl_Pushing = 0 '推料气缸
GLOBAL Cyl_Lifting = 1 '升降气缸
'轴定义
GLOBAL Axis_Loading = 0 '上料轴
GLOBAL Axis_Blanking = 1 '下料轴
'气缸相关信息
GLOBAL DIM Cylinder(10) '气缸集合
Cylinder(0,Cyl_Pushing,Cyl_Lifting)'从0开始赋值
GLOBAL DIM Cyl_InPlace(10) '气缸到位输入
Cyl_InPlace(0,I_PushCylInP,I_LiftCylInP) '这个顺序要与气缸赋值顺序一致
GLOBAL DIM Cyl_InSitu(10) '气缸原位输入
Cyl_InSitu(0,I_PushCylInS,I_LiftCylInS)
GLOBAL DIM Cyl_OutInPlace(10) '气缸到位输出
Cyl_OutInPlace(0,O_PushCylOutP,O_LiftCylOutP)
GLOBAL DIM Cyl_OutInSitu(10) '气缸原位输出 '如果是单控的气缸,那么不需要输入这个,填写-1即可
Cyl_OutInSitu(0,O_PushCylOutS,-1)
'轴相关信息
GLOBAL AxisArray(10) '轴集合
AxisArray(0,Axis_Loading,Axis_Blanking)
GLOBAL AxisEnable(10) '轴使能
AxisEnable(0,O_AxisLoadEn,O_AxisBlankEn)
GLOBAL AxisAlm(10)'轴报警
AxisAlm(0,I_AxisLoadAlm,I_AxisBlankAlm)
GLOBAL AxisDatumIn(10)'轴原点
AxisDatumIn(0,I_AxisLoadDatum,I_AxisBlankDatum)
GLOBAL AxisFSLimit(10)'轴正极限
AxisFSLimit(0,I_AxisLoadFS,I_AxisBlankFS)
GLOBAL AxisRSLimit(10)'轴负极限 '回完原点后,负极限就设置为跟原点一样的信号
AxisRSLimit(0,I_AxisLoadDatum,I_AxisBlankDatum)
'气缸控制
GLOBAL SUB CylinderControl(cylnum,bValue,timeout)
LOCAL home,place
CylRetry:
IF SUB_IFPARA(2) = 0 THEN timeout = 5000
OP(Cyl_OutInPlace(cylnum)) = bValue
IF Cyl_OutInSitu(cylnum) != -1 THEN OP(Cyl_OutInSitu) = NOT bValue
IF bValue THEN
place = Cyl_OutInPlace(cylnum)
home = Cyl_OutInSitu(cylnum)
ELSE
place = Cyl_OutInSitu(cylnum)
home = Cyl_OutInPlace(cylnum)
ENDIF
TICKS = timeout
WHILE TICKS<0 OR (IN(place) = ON AND IN(home) = OFF)
CheckContinue()
WEND
IF NOT(IN(place) = ON AND IN(home) = OFF) THEN
ERROR "气缸动作失败"
'可以暂停程序,将设备模式设置为暂停模式,同时改变三色灯状态
GOTO CylRetry
ENDIF
ENDSUB
'检测是否暂停
GLOBAL SUB CheckContinue()
WHILE system_state =system_pause
DELAY(1)
WEND
ENDSUB
'轴控制
GLOBAL SUB AxisControl(axisnum,axisspeed,pos,timeout,stopsign)
AxisRetry:
IF SUB_IFPARA(3) = 0 THEN timeout = 10000
BASE(axisnum)
SPEED = axisspeed
MOVEABS(pos)
TICKS = timeout
WHILE TICKS < 0
IF SUB_IFPARA(4) = 0 THEN
IF IN(stopsign) THEN EXIT WHILE
ENDIF
CheckContinue()
WEND
IF IDLE(axisnum) = 0 THEN
CANCEL(2) AXIS(axisnum)
I WAIT UNTIL AXISSTATUS(axisnum) & $800 = 1
ENDIF
IF AXISSTATUS(axisnum) <> 0 THEN
ERROR "轴状态为",AXISSTATUS(axisnum)
'可以暂停程序,将设备模式设置为暂停模式,同时改变三色灯状态
GOTO AxisRetry
ENDIF
ENDSUB
'上料程序
GLOBAL SUB Loading()
'输入点
GLOBAL DIM Load_In(10)
Load_In(0,I_Start)
'输出点
GLOBAL DIM Load_Out(10)
'气缸
GLOBAL DIM Load_Cyl(10)
Load_Cyl(0,Cyl_Pushing)
'轴
GLOBAL DIM Load_Axis(10)
Load_Axis(0,Axis_Loading)
LoadingStart:
WAIT UNTIL IN(Load_In(0)) '等待启动信号
CylinderControl(Load_Cyl(0),ON,10000)
AxisControl(Load_Axis(0),200,300,10000)
GOTO LoadingStart
ENDSUB
有需要的话,可以私信拿项目文件
如有疑问或文档里存在错误,烦请私信下,予以改正