当前位置: 首页 > news >正文

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

相关文章:

  • ros2_control【B站WMGIII教学学习记录】1
  • Linux 软件包工具rpmbuild
  • 《代码大全》读后感:软件开发的黄金法则
  • 深度学习| 注意力机制
  • 使用 PhpMyAdmin 安装 LAMP 服务器
  • 基于Google Gemini 探索大语言模型在医学领域应用评估和前景
  • android开发平台,Java+性能优化+APP开发+NDK+跨平台技术
  • [蓝桥杯 2021 省 AB2] 小平方
  • 网络工程师笔记2
  • 云尚办公-0.1.0
  • VUE基础知识九 ElementUI项目
  • 【无标题】积鼎CFD VirtualFlow:航空及汽车燃油晃动流体仿真计算及试验对比
  • DockerCompose安装、使用 及 微服务部署实操
  • 非零基础自学Golang 2 开发环境 2.4 Git 安装
  • 06 估计量的评优准则
  • [附源码]计算机毕业设计校刊投稿系统Springboot程序
  • 【Kotlin 协程】协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )
  • 【世界杯】free-api-worldcup2022 免费世界杯API
  • Qt OpenGL(二十五)——Qt OpenGL 核心模式-Qt封装的函数实现彩色三角形
  • LeetCode 0542. 01 矩阵
  • 【C++智能指针】智能指针的发展和循环引用的原理和解决
  • 央企招聘:正式编制!八险三金!各项福利!中国邮政招人啦!
  • 欧拉公式 Euler‘s Formula
  • 0.安装和配置
  • redis我记不住的那些命令(六)
  • Spring - @PostConstruct 源码解析
  • JS 正则表达式常用方法
  • 2-分类问题 SVM 核函数
  • [附源码]计算机毕业设计校园订餐管理系统Springboot程序
  • GitLab CI/CD系列教程(一)
  • html当当书网站 html网上在线书城 html在线小说书籍网页 当当书城网页设计
  • [附源码]JAVA毕业设计课程网站设计(系统+LW)