• 博图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;

  • 相关阅读:
    2.10 PE结构:重建重定位表结构
    【微信小程序】flex布局
    LeetCode 414. Third Maximum Number
    天津五家受欢迎的python培训机构 python凭什么这么火?
    [Python]Django 视图(View)和URL 与 模板(Template)
    深度学习之图像识别核心技术与案例实战
    pytorch-09.多分类问题
    OkHttpsUtil
    【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、
    Window对象加载时的区别与倒计时
  • 原文地址:https://blog.csdn.net/xdpcxq/article/details/128169183