博图Modbus组态及参数设定源码
1、组态选择 协议为Modbus,可在程序里设置通讯方式
2、参数初始化设置
3、选择伺服Modbus 地址
4、写入负值,两个字都必须是负值
5、接线方式
伺服端:驱动器通过通讯连接器与计算机相连,使用者可利用 MODBUS 通讯结合汇编语言来操作驱动器,或 PLC、 HMI。我们提供两种常用通讯界面:(1) RS-232 ; (2) RS-485。 RS-232 供操作软件 “Lexium23 Plus CT”使用,通讯距离大约 15 米。选择使用RS-485,可达较远的传输距离,且支持多组驱动器同时联机能力。
串口端:接4 RS-485+ /11 RS-485- / 8接地信号
6、参数设定程序源码
//状态值设定
"速度计算_DB".当前位置:="PositionValue";
//"当前条码值":="PositionValue";
//"当前条码速度" := "VelocityValue";
//"读码器状态值" := "StatusAndControl";
//运行过程中提升机丢失
IF ("速度计算_DB".目的位置 = "基础参数".Coordinate[3, 0, 1] AND "流程控制_DB".穿梭车状态.M_28 = 1 OR
#穿梭车状态.定位到提升机 = 1) THEN
IF #穿梭车状态.提升机当前层 <> "基础参数".warehouse.当前所在层 OR "流程控制_DB".基础报警.Alarm_6 = 1
OR "接收提升机的数据".提升当前层 <>"基础参数".warehouse.当前所在层 OR "接收提升机的数据".提升机有故障 <> 0
OR ("接收提升机的数据".停准信号 = 0 AND "PositionValue" <= "基础参数".Coordinate[3, 1, "基础参数".warehouse.当前所在层])
// OR "接收提升机的数据".开启机构开到位=0 OR "接收提升机的数据".开启机构关到位=1
THEN
"流程控制_DB".基础报警.Alarm_15 := 1;
END_IF;
END_IF;
(********************************************** 报警信息反馈 *******************************************************)
//提升机与穿梭车在同层的情况下
IF "基础参数".warehouse.当前所在层 <> 0 AND
"接收提升机的数据".提升当前层 = "基础参数".warehouse.当前所在层 AND
#穿梭车状态.提升机当前层 = "基础参数".warehouse.当前所在层
THEN
IF "速度计算_DB".当前位置 > 22460 THEN
"流程控制_DB".#流程类报警.Alarm_28 := 1;
ELSE
"流程控制_DB".#流程类报警.Alarm_28 := 0;
END_IF;
END_IF;
//提升机与穿梭车在不同层的情况下
IF ("接收提升机的数据".提升当前层 <> "基础参数".warehouse.当前所在层 OR
#穿梭车状态.提升机当前层 <> "基础参数".warehouse.当前所在层) AND
#穿梭车状态.穿梭车在提升机内 = 0
THEN
IF "速度计算_DB".当前位置 > "速度计算_DB".前极限位置 THEN
"流程控制_DB".#流程类报警.Alarm_28 := 1;
ELSE
"流程控制_DB".#流程类报警.Alarm_28 := 0;
END_IF;
END_IF;
IF "速度计算_DB".当前位置 < "速度计算_DB".后极限位置 THEN
"流程控制_DB".#流程类报警.Alarm_29 := 1;
ELSE
"流程控制_DB".#流程类报警.Alarm_29 := 0;
END_IF;
//"WCS_Read".小车错误代码ID := 0;
FOR #F01 := 1 TO 50 DO
IF "故障列表".Alram[#F01] <> 0 AND "时钟脉冲处理_DB".脉冲输出[7] = 1 THEN
"WCS_Read".小车错误代码ID := 0;
"WCS_Read".小车错误代码ID := #F01;
END_IF;
END_FOR;
(******************************************** 判断排列层数值是否非0 ***********************************************)
IF "基础参数".warehouse.总排数 = 0 OR "基础参数".warehouse.总列数 = 0 OR "基础参数".warehouse.总层数 = 0
OR "基础参数".warehouse.当前所在层 =0 OR "接收提升机的数据".提升当前层 = 0 THEN
"流程控制_DB".#基础报警.Alarm_1:=1;
RETURN;
END_IF;
(******************************************** 计算穿梭车当前列 ***********************************************)
"基础参数".warehouse.当前所在排 := 3;
#A01 := "基础参数".warehouse.当前所在排;
//计算穿梭车当前列
IF "基础参数".warehouse.当前所在排 <> 0 AND "基础参数".warehouse.当前所在层 <> 0 THEN
FOR #F01 := 1 TO "基础参数".warehouse.总层数 DO
FOR #F02 := 0 TO "基础参数".warehouse.总列数 DO
IF "基础参数".warehouse.当前所在层 = #F01 THEN
IF "速度计算_DB".当前位置 < "基础参数".Coordinate[#A01, #F02, #F01]+100 AND
"速度计算_DB".当前位置 > "基础参数".Coordinate[#A01, #F02, #F01]-100 THEN
"基础参数".warehouse.当前所在列 := #F02;
END_IF;
END_IF;
END_FOR;
END_FOR;
END_IF;
(******************************************** 穿梭车定位到附近货位 ***********************************************)
IF "触摸屏使用".半自动.货位定位 = 1 THEN
FOR #F01 := 0 TO "基础参数".warehouse.总列数 DO
IF "速度计算_DB".当前位置 + 200 > "基础参数".Coordinate["基础参数".warehouse.当前所在排, #F01, "基础参数".warehouse.当前所在层]
& "速度计算_DB".当前位置 - 200 < "基础参数".Coordinate["基础参数".warehouse.当前所在排, #F01, "基础参数".warehouse.当前所在层]
THEN
"速度计算_DB".目的位置 := "基础参数".Coordinate["基础参数".warehouse.当前所在排, #F01, "基础参数".warehouse.当前所在层];
IF "速度计算_DB".当前位置 < "基础参数".Coordinate["基础参数".warehouse.当前所在排, #F01, "基础参数".warehouse.当前所在层]
THEN
"触摸屏使用".半自动.前进标识 := 1;
"触摸屏使用".半自动.后退标识 := 0;
ELSIF "速度计算_DB".当前位置 > "基础参数".Coordinate["基础参数".warehouse.当前所在排, #F01, "基础参数".warehouse.当前所在层]
THEN
"触摸屏使用".半自动.后退标识 := 1;
"触摸屏使用".半自动.前进标识 := 0;
END_IF;
IF "速度计算_DB".当前位置 >= "基础参数".Coordinate["基础参数".warehouse.当前所在排, #F01, "基础参数".warehouse.当前所在层] - 2 &
"速度计算_DB".当前位置 <= "基础参数".Coordinate["基础参数".warehouse.当前所在排, #F01, "基础参数".warehouse.当前所在层] + 2
THEN
"触摸屏使用".半自动.货位定位 := 0;
"流程控制_DB".穿梭车状态.MA_10 := 0;
"流程控制_DB".穿梭车状态.MA_11 := 0;
"触摸屏使用".半自动.前进标识 := 0;
"触摸屏使用".半自动.后退标识 := 0;
END_IF;
END_IF;
END_FOR;
ELSE
"触摸屏使用".半自动.前进标识 := "流程控制_DB".穿梭车状态.MA_10;
"触摸屏使用".半自动.后退标识 := "流程控制_DB".穿梭车状态.MA_11;
END_IF;
(******************************************** 小车运行的启始位置判断 ***********************************************)
IF #穿梭车状态.任务执行中 = 1 AND #穿梭车状态.穿梭车行驶到位 = 0 AND "行走伺服SPD0" = 0 THEN
"速度计算_DB".起始位置 := "速度计算_DB".当前位置;
END_IF;
(******************************************** 小车行走方向判断 ***********************************************)
IF "流程控制_DB".穿梭车状态.M_27 = 1 THEN
"速度计算_DB".状态方向 := 0;
"流程控制_DB".穿梭车状态.M_28 := 0;
END_IF;
IF #穿梭车状态.任务执行中 <> 0 AND #穿梭车状态.穿梭车行驶到位 = 0 THEN
IF "速度计算_DB".当前位置 - "速度计算_DB".目的位置 > 2
THEN
"速度计算_DB".状态方向 := 2;(*后退*)
"流程控制_DB".穿梭车状态.M_28 := 1;
ELSIF "速度计算_DB".当前位置 - "速度计算_DB".目的位置 < -2
THEN
"速度计算_DB".状态方向 := 1;(*前进*)
"流程控制_DB".穿梭车状态.M_28 := 1;
END_IF;
END_IF;
(******************************************** 小车到位判断 ***********************************************)
#穿梭车状态.穿梭车行驶到位 := 0;
IF "速度计算_DB".目的位置 <> 0
THEN
IF "速度计算_DB".当前位置 >= "速度计算_DB".目的位置 - 2 &
"速度计算_DB".当前位置 <= "速度计算_DB".目的位置 + 2
THEN
#穿梭车状态.穿梭车行驶到位 := 1;
END_IF;
END_IF;
#Temp[1].S5 := S_ODT(T_NO := "穿梭车到位ON延时", S := #穿梭车状态.穿梭车行驶到位 ,
TV := S5T#100MS, R := NOT (#穿梭车状态.穿梭车行驶到位 ),
BI => #Temp[1].BI, Q => #Temp[1].Q);
#穿梭车状态.穿梭车停准信号 := #Temp[1].Q;
(*
//穿梭车停准信号
#Temp[1].S5 := S_ODT(T_NO := "穿梭车到位ON延时", S := #穿梭车状态.穿梭车行驶到位,
TV := S5T#50MS, R := NOT (#穿梭车状态.穿梭车行驶到位),
BI => #Temp[1].BI, Q => #Temp[1].Q);
//穿梭车停准信号
#Temp[2].S5 := S_ODT(T_NO := "穿梭车到位OFF延时", S := NOT (#穿梭车状态.穿梭车行驶到位),
TV := S5T#50MS, R := #穿梭车状态.穿梭车行驶到位,
BI => #Temp[2].BI, Q => #Temp[2].Q);
IF #Temp[1].Q = 1 THEN
#穿梭车状态.穿梭车停准信号 := 1;
ELSIF #Temp[2].Q = 1 THEN
#穿梭车状态.穿梭车停准信号 := 0;
END_IF;
*)
(************************************************ 任务完成情况判断 *****************************************)
//定位完成情况
IF "流程控制_DB".穿梭车状态.M_27 = 1 AND #穿梭车状态.任务执行中 = 1 AND #穿梭车状态.穿梭车行驶到位 = 1 AND
#穿梭车状态.穿梭车停准信号=1
THEN
IF #穿梭车状态.任务类型暂存 = 1 THEN
#穿梭车状态.任务类型暂存 := 0;
#穿梭车状态.任务执行中 := 0;
"速度计算_DB".状态方向 := 0;
"触摸屏使用".任务暂存.任务目标排 := 0;
"触摸屏使用".任务暂存.任务目标列 := 0;
"触摸屏使用".任务暂存.任务目标层 := 0;
END_IF;
IF #穿梭车状态.定位到提升机 = 1 OR #穿梭车状态.定位到一列 = 1 THEN
#穿梭车状态.任务执行中 := 0;
"速度计算_DB".状态方向 := 0;
#穿梭车状态.定位到提升机 := 0;
#穿梭车状态.定位到一列 := 0;
END_IF;
END_IF;
(************************************************ 定位完成发送任务类型 *****************************************)
IF "流程控制_DB".当前任务暂存 <> 0 AND "流程控制_DB".穿梭车状态.M_27 = 1 AND "流程控制_DB".穿梭车状态.M_28 = 0 AND
#穿梭车状态.穿梭车行驶到位=1 THEN
IF "触摸屏使用".任务暂存.任务起始排 <> 0 AND "触摸屏使用".任务暂存.任务起始层 <> 0
THEN
IF "触摸屏使用".任务暂存.任务起始层 = "基础参数".warehouse.当前所在层 AND
"触摸屏使用".任务暂存.任务起始列 = "基础参数".warehouse.当前所在列
THEN
"流程控制_DB".当前任务判断 := "流程控制_DB".当前任务暂存;
"流程控制_DB".当前任务暂存 := 0;
"触摸屏使用".任务暂存.任务起始排 := 0;
"触摸屏使用".任务暂存.任务起始列 := 0;
"触摸屏使用".任务暂存.任务起始层 := 0;
END_IF;
END_IF;
// "触摸屏使用".任务暂存.任务目标排 := 3;
IF "触摸屏使用".任务暂存.任务目标排 <> 0 AND "触摸屏使用".任务暂存.任务目标层 <> 0 AND
"触摸屏使用".任务暂存.任务起始排=0 AND "触摸屏使用".任务暂存.任务起始层=0
THEN
IF "触摸屏使用".任务暂存.任务目标层 = "基础参数".warehouse.当前所在层 AND
"触摸屏使用".任务暂存.任务目标列 = "基础参数".warehouse.当前所在列
THEN
"流程控制_DB".当前任务判断 := "流程控制_DB".当前任务暂存;
"流程控制_DB".当前任务暂存 := 0;
"触摸屏使用".任务暂存.任务目标排 := 0;
"触摸屏使用".任务暂存.任务目标列 := 0;
"触摸屏使用".任务暂存.任务目标层 := 0;
END_IF;
END_IF;
END_IF;
//取货允许和放货允许判断
(*入库任务时*)
IF #穿梭车状态.任务类型暂存 = 10 THEN
"流程控制_DB".穿梭车状态.M_22 := 0;
IF "接收提升机的数据".输送机允许取货 <> 0 THEN
"流程控制_DB".穿梭车状态.M_22 := 1;
END_IF;
ELSE
"流程控制_DB".穿梭车状态.M_22 := 1;
END_IF;
(*出库任务时*)
IF #穿梭车状态.任务类型暂存 = 11 THEN
"流程控制_DB".穿梭车状态.M_23 := 0;
IF "接收提升机的数据".输送机允许放货 <> 0 THEN
"流程控制_DB".穿梭车状态.M_23:= 1;
END_IF;
ELSE
"流程控制_DB".穿梭车状态.M_23 := 1;
END_IF;
//判断任务-取货完成情况
IF "流程控制_DB".穿梭车状态.M_19 = 1 THEN
IF #穿梭车状态.任务类型暂存 = 10(*入库任务时需要将取货完成反馈给上位机*) THEN
"写给提升机的数据".取货完成 := 1;
END_IF;
IF "WCS_状态整合".New_Task = 0 THEN
IF #穿梭车状态.上位机完成任务暂存 <> 0 THEN
"WCS_Read".TaskID := #穿梭车状态.上位机完成任务暂存;
#穿梭车状态.上位机完成任务暂存 := 0;
END_IF;
#穿梭车状态.任务类型暂存 := 0;
END_IF;
#穿梭车状态.任务执行中 := 0;
"流程控制_DB".当前任务判断 := 0;
"流程控制_DB".穿梭车状态.M_19 := 0;
END_IF;
//判断任务-放货完成情况
IF "流程控制_DB".穿梭车状态.M_21 = 1 THEN
IF #穿梭车状态.任务类型暂存 = 11(*入库任务时需要将取货完成反馈给上位机*) THEN
"写给提升机的数据".放货完成 := 1;
END_IF;
IF "WCS_状态整合".New_Task = 0 THEN
IF #穿梭车状态.上位机完成任务暂存 <> 0 THEN
"WCS_Read".TaskID := #穿梭车状态.上位机完成任务暂存;
#穿梭车状态.上位机完成任务暂存 := 0;
END_IF;
#穿梭车状态.任务类型暂存 := 0;
END_IF;
#穿梭车状态.任务执行中 := 0;
"流程控制_DB".当前任务判断 := 0;
"流程控制_DB".穿梭车状态.M_21 := 0;
END_IF;