• MODOBUS伺服通讯设置


    (*********************************【Modbus_Comm_Load参数设置】********************************)
    //Modbus_Comm_Load允许组态Modbus_RTU的通讯模块端口
    #Modbus_Comm_Load_Instance.REQ := "第一个循环触发" OR #Re_Load_Master;

    #Modbus_Comm_Load_Instance(REQ:= #Modbus_Comm_Load_Instance.REQ ,//触发位
                               "PORT":="Local~CM_PtP_RS422_485_HF_1",//CM 端口值,即“硬件 ID
                               BAUD:=57600,//波特率
                               PARITY:=0,//选择奇偶校验
                               FLOW_CTRL:=0,//选择流控制 默认)无流控制                           
                               RTS_ON_DLY:=0,//RTS 接通延迟选择,
                               RTS_OFF_DLY:=0,//RTS 关断延迟选择
                               RESP_TO:=1000,//响应超时
                               DONE=>#Modbus_Comm_Load_Instance.DONE,//完成并且没有错误
                               ERROR=>#Modbus_Comm_Load_Instance.ERROR,//完成出错
                               STATUS=>#Modbus_Comm_Load_Instance.STATUS,//完成出错代码
                               MB_DB:=#Modbus_Master_Instance.MB_DB);

    IF #Re_Load_Master = 1 OR "第一个循环触发" THEN
        IF #Modbus_Comm_Load_Instance.ERROR = 0 THEN
            IF #Modbus_Comm_Load_Instance.DONE = 1 THEN
                "流程控制_DB".#基础报警.Alarm_10 := 0;
                #Re_Load_Master := 0;
            END_IF;
        END_IF;
    END_IF;

    //如果首次参数设置失败则退出MODBUS通讯块。
    IF   #Re_Load_Master OR  "第一个循环触发"  OR ("参数设定_DB".穿梭车状态.任务执行中=0 AND "触摸屏使用".维修.维修执行=0)
    THEN
        #伺服参数写入 := 1;
        #伺服参数读取 := 0;
        #W_DATA := 0;
        #伺服读取无措完成 := 0;
        #伺服读取无措完成 := 0;
        #伸缩伺服动作开始 := 0;
        RETURN;
    END_IF;

    (**************************************行走伺服参数设定**********************************)
    IF "流程控制_DB".穿梭车状态.M_28 = 1 AND "触摸屏使用".维修.维修执行=0 THEN
        
        IF #伺服读取无措完成 = 1 THEN
            #伺服参数写入 := 1;
            #伺服读取无措完成 := 0;
        ELSIF #伺服写入无措完成 = 1 THEN
            #伺服参数读取 := 1;
            #伺服写入无措完成 := 0;
            IF #W_DATA < 10 THEN
                #W_DATA := #W_DATA + 1;
            END_IF;
        END_IF;
        
        
        
     //Modobus站地址
        #Modbus_Master_Instance.MB_ADDR := 1;
        (*MODBUS地址*)
        #Modbus_Master_Instance.DATA_ADDR := 40275;
        (*写入长度*)
        #Modbus_Master_Instance.DATA_LEN := 4;
        
     IF #伺服参数写入 = 1 THEN
         //模式选择: 指定请求类型(0读取、1写入或诊断)C
         #Modbus_Master_Instance.MODE := 1;
         
         IF "速度计算_DB".状态方向 <> 0 AND "参数设定_DB".穿梭车状态.任务执行中 <> 0
         THEN
             IF "速度计算_DB".状态方向 = 1 THEN
                 "Master_Data_W".M_Data[2] := 0;//前进
                 "Master_Data_W".M_Data[1] := DINT_TO_WORD("速度计算_DB".转换值);
                 #伺服写入参数准备OK := 1;
             ELSIF "速度计算_DB".状态方向 = 2 THEN
                 "Master_Data_W".M_Data[2] := -1;//后退
                 "Master_Data_W".M_Data[1] := DINT_TO_WORD(- "速度计算_DB".转换值);
                 #伺服写入参数准备OK := 1;
             END_IF;
         ELSE
             "Master_Data_W".M_Data[2] := 0;
             "Master_Data_W".M_Data[1] := 0;
         END_IF;
         
    ELSIF #伺服参数读取 = 1 THEN
     #Modbus_Master_Instance.MODE := 0;
     END_IF;
    END_IF;


    (*************************************伸缩伺服参数设定**********************************)

    IF "流程控制_DB".穿梭车状态.M_28 = 0 (*AND "流程控制_DB".当前任务判断 <> 0 *)OR "触摸屏使用".维修.维修执行=1 THEN
        
        IF #伺服写入无措完成 = 1 THEN
            #伺服参数读取 := 1;
        END_IF;
        
    //用于初始化 #伺服写入无措完成 信号    
        IF #伸缩伺服动作开始 = 0 THEN
            #伺服写入无措完成 := 0;
            #伸缩伺服动作开始 := 1;
        END_IF;
        
        //Modobus站地址
        #Modbus_Master_Instance.MB_ADDR := 2;
        #Modbus_Master_Instance.DATA_ADDR := 41295;
        #Modbus_Master_Instance.DATA_LEN := 2;
        
        IF #伺服写入无措完成 = 1 AND "流程控制_DB".穿梭车状态.MA_05 = 1(*复位*) THEN
            #伺服写入无措完成 := 0;
        END_IF;

        IF ("流程控制_DB".穿梭车状态.MA_14 = 1 OR "流程控制_DB".穿梭车状态.MA_15 = 1 OR
            "流程控制_DB".穿梭车状态.MA_16 = 1 OR "流程控制_DB".#伸缩臂控制.M_07 = 1 OR
            "流程控制_DB".#伸缩臂控制.M_01 = 1 OR "流程控制_DB".#伸缩臂控制.M_02 = 1 OR
            "流程控制_DB".#伸缩臂控制.M_03 = 1 OR "流程控制_DB".#伸缩臂控制.M_04 = 1 OR
            "流程控制_DB".#伸缩臂控制.M_05 = 1 OR "流程控制_DB".#伸缩臂控制.M_06 = 1 OR
            "流程控制_DB".#伸缩臂控制.M_15 = 1 OR "流程控制_DB".#伸缩臂控制.M_16 = 1 )AND
            #伺服写入无措完成=0 AND "流程控制_DB".流程类报警.Alarm_总=0
        THEN
            #伺服写入参数准备OK := 1;
        END_IF;
        
        IF    #伺服写入参数准备OK=1 AND "Master_Data_W".M_Data[1]<>0 THEN
            #Modbus_Master_Instance.MODE := 1;
            #伺服参数写入 := 1;
        ELSE
            #Modbus_Master_Instance.MODE := 0;
        END_IF;
        
        IF #伺服写入无措完成 = 0 AND  "流程控制_DB".流程类报警.Alarm_总=0 THEN
            IF  "流程控制_DB".#伸缩臂控制.M_02 = 1 THEN
                "Master_Data_W".M_Data[1] := 2;
                
            ELSIF  "流程控制_DB".#伸缩臂控制.M_04 = 1 THEN
                "Master_Data_W".M_Data[1] := 3;
            ELSIF "流程控制_DB".#伸缩臂控制.M_01 = 1 THEN
                "Master_Data_W".M_Data[1] := 4;
            ELSIF "流程控制_DB".#伸缩臂控制.M_03 = 1 THEN
                "Master_Data_W".M_Data[1] := 5;
            ELSIF "流程控制_DB".#伸缩臂控制.M_05 = 1 OR "流程控制_DB".穿梭车状态.MA_14 = 1 THEN
                "Master_Data_W".M_Data[1] := 6;
            ELSIF "流程控制_DB".#伸缩臂控制.M_06 = 1 OR "流程控制_DB".穿梭车状态.MA_15 = 1  THEN
                "Master_Data_W".M_Data[1] := 7;
            ELSIF "流程控制_DB".穿梭车状态.MA_16 = 1 OR "流程控制_DB".#伸缩臂控制.M_07 = 1 THEN
                "Master_Data_W".M_Data[1] := 1;
            END_IF;
        END_IF;

        IF #伺服写入无措完成 AND "Master_Data_W".M_Data[1] + 20000 = "Master_Data_R".M_Data[1] THEN
            IF "流程控制_DB".#伸缩臂控制.M_01 = 1 THEN
                "流程控制_DB".#伸缩臂控制.M_08 := 1;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
            ELSIF "流程控制_DB".#伸缩臂控制.M_02=1 THEN
                "流程控制_DB".#伸缩臂控制.M_09 := 1;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
            ELSIF "流程控制_DB".#伸缩臂控制.M_03=1 THEN
                "流程控制_DB".#伸缩臂控制.M_10 := 1;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
            ELSIF "流程控制_DB".#伸缩臂控制.M_04=1 THEN
                "流程控制_DB".#伸缩臂控制.M_11 := 1;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
            ELSIF "流程控制_DB".#伸缩臂控制.M_05=1 THEN
                "流程控制_DB".#伸缩臂控制.M_12 := 1;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
            ELSIF "流程控制_DB".#伸缩臂控制.M_06=1 THEN
                "流程控制_DB".#伸缩臂控制.M_13 := 1;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
            ELSIF "流程控制_DB".#伸缩臂控制.M_07=1 THEN
                "流程控制_DB".#伸缩臂控制.M_14 := 1;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
                

            ELSIF  "流程控制_DB".穿梭车状态.MA_14=1 THEN
                "流程控制_DB".#伸缩臂控制.M_09 := 1;
                 "流程控制_DB".穿梭车状态.MA_14 := 0;
                 "Master_Data_W".M_Data[1] := 0;
                 #伺服写入无措完成 := 0;
            ELSIF  "流程控制_DB".穿梭车状态.MA_15=1 THEN
                "流程控制_DB".#伸缩臂控制.M_11 := 1;
                 "流程控制_DB".穿梭车状态.MA_15 := 0;
                 "Master_Data_W".M_Data[1] := 0;
                 #伺服写入无措完成 := 0;
            ELSIF  "流程控制_DB".穿梭车状态.MA_16 =1 THEN
                "流程控制_DB".#伸缩臂控制.M_14 := 1;
                "流程控制_DB".穿梭车状态.MA_16 := 0;
                "Master_Data_W".M_Data[1] := 0;
                #伺服写入无措完成 := 0;
            END_IF;
        END_IF;
    END_IF;


    (*************************************伺服参数写入和读取设定**********************************)

    (*****【Modbus_Master 主站通讯-接收调用】******)
    IF #Modbus_Master_Instance.MODE = 0 THEN
        #Modbus_Master_Instance(REQ := #伺服参数读取,//触发信号
                                MB_ADDR := #Modbus_Master_Instance.MB_ADDR,//访问的从站地址
                                MODE := #Modbus_Master_Instance.MODE,//与“DATA_ADDR”参数一起决定 Modbus 功能码为
                                DATA_ADDR := #Modbus_Master_Instance.DATA_ADDR,//Modobus地址
                                DATA_LEN := #Modbus_Master_Instance.DATA_LEN,//数据长度为  
                                DONE => #Modbus_Master_Instance.DONE,//无错误完成脉冲
                                BUSY => #Modbus_Master_Instance.BUSY,//繁忙
                                ERROR => #Modbus_Master_Instance.ERROR,//有错误完成脉冲
                                STATUS => #Modbus_Master_Instance.STATUS,//错误代码
                                DATA_PTR := "Master_Data_R".M_Data);//数据长度为
    END_IF;
        
    (*****【Modbus_Master 主站通讯-发送调用】******)
    //写入行走伺服参数
    IF #Modbus_Master_Instance.MODE = 1 THEN
        #Modbus_Master_Instance(REQ := #伺服参数写入,//触发信号
                                MB_ADDR := #Modbus_Master_Instance.MB_ADDR,//访问的从站地址
                                MODE := #Modbus_Master_Instance.MODE,//与“DATA_ADDR”参数一起决定 Modbus 功能码为
                                DATA_ADDR := #Modbus_Master_Instance.DATA_ADDR,//Modobus地址
                                DATA_LEN := #Modbus_Master_Instance.DATA_LEN,//数据长度为  
                                DONE => #Modbus_Master_Instance.DONE,//无错误完成脉冲
                                BUSY => #Modbus_Master_Instance.BUSY,//繁忙
                                ERROR => #Modbus_Master_Instance.ERROR,//有错误完成脉冲
                                STATUS => #Modbus_Master_Instance.STATUS,//错误代码
                                DATA_PTR := "Master_Data_W".M_Data);//数据长度为   
    END_IF;

    //判断伺服完成情况
    IF #Modbus_Master_Instance.BUSY = 0 AND #Modbus_Master_Instance.ERROR = 0 THEN
        IF #Modbus_Master_Instance.DONE = 1 AND #伺服参数写入= 1 THEN
            #伺服参数写入 := 0;
            #伺服写入参数准备OK := 0;
            #伺服写入无措完成 := 1;
            "流程控制_DB".#基础报警.Alarm_11 := 0;
        ELSIF #Modbus_Master_Instance.DONE = 1 AND #伺服参数读取 = 1 THEN
            #伺服参数读取 := 0;
            #伺服读取无措完成 := 1;
            "流程控制_DB".#基础报警.Alarm_11 := 0;
        END_IF;
    END_IF;

  • 相关阅读:
    ASEMI整流桥KBPC3510,KBPC3510封装,KBPC3510应用
    高性价比MOS推荐:惠海HC090N10L,HC025N10L,100V高耐压,12V/24V加湿器和3.7V打火机专用MOS
    DVWA靶场搭建教程
    【无标题】
    GoLang Map 实现分析
    网络信息安全岗位NISP应该如何面试(三)NISP管理中心
    Redis实战——缓存
    解决微信小程序导入项目报错: [app.json文件内容错误]app.json未找到
    基于java的学生选课成绩信息系统-计算机毕业设计
    4.3-内置后置PostProcess处理器深度讲解
  • 原文地址:https://blog.csdn.net/xdpcxq/article/details/128169246