SCL实现modbus多从站通讯
FUNCTION_BLOCK "MUDBUS通信块"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
port : PORT := 272; // 端口号
start_connect : Bool; // 开始建立连接
END_VAR
VAR_OUTPUT
return_status : Word; // 状态返回值
END_VAR
VAR_IN_OUT
MB_COMM_LOAD_REQ : Bool; // 初始化使能条件
master_REQ : Bool; // MATEB使能条件
INIT_OK : Bool; // 初始化完成位
END_VAR
VAR
Request : Array[0..10] of Struct // 需要读写的数据格式
slaveno : UInt := 2; // 站号
mode : USInt; // 模式
DATAadress : UDInt := 413067; // 数据地址
datalength : UInt := 1; // 数据长度
DATA : Array[0..10] of Int; // 数据
END_STRUCT;
Master_times : USInt; // 读写的当前数据
MB_COMM_LOAD_DB {InstructionName := 'MB_COMM_LOAD'; LibVersion := '2.1'} : MB_COMM_LOAD;
MB_MASTER_DB {InstructionName := 'MB_MASTER'; LibVersion := '2.2'} : MB_MASTER;
END_VAR
VAR CONSTANT
first_master : USInt := 1;
last_master : USInt := 7;
even : USInt := 2;
parity : USInt := 1;
none : USInt;
END_VAR
BEGIN
//开始建立连接条件,初始化完成信号
//需要读写的数据都写在FB块里面
IF #start_connect = 1 THEN
IF #INIT_OK = 0 THEN
#MB_COMM_LOAD_REQ := 1;
END_IF;
ELSE
#INIT_OK := 0;
END_IF;
"MB_COMM_LOAD_DB"(REQ:=#MB_COMM_LOAD_REQ,
"PORT":=#port,
MB_DB:=#MB_MASTER_DB);
#return_status:=0;
//初始化出错,则返回错误代码存入reurn_status存储其中
IF #MB_COMM_LOAD_DB.ERROR THEN
#return_status := "MB_COMM_LOAD_DB".STATUS;
RETURN;
END_IF;
//初始化完成,则复位初始化请求条件,并置位初始化完成标志位,激活第一条master的请求条件
IF #MB_COMM_LOAD_DB.DONE THEN
#MB_COMM_LOAD_REQ := 0;
#INIT_OK := 1;
#master_REQ := 1;
END_IF;
//初始化为完成,则返回
IF #INIT_OK = 0 THEN
RETURN;
END_IF;
//循环次数小于最小次数或最大次数时,从开头开始执行
IF #Master_times < #first_master OR #Master_times > #last_master THEN
#Master_times := #first_master;
END_IF;
//调用MB_master指令发送数据
"MB_MASTER_DB"(REQ:=#master_REQ,
MB_ADDR:=#Request[#Master_times].slaveno,
MODE:=#Request[#Master_times].mode,
DATA_ADDR:=#Request[#Master_times].DATAadress,
DATA_LEN:=#Request[#Master_times].datalength,
DATA_PTR:=#Request[#Master_times].DATA);
//数据发送完成后,执行吓一跳master指令
IF #MB_COMM_LOAD_DB.DONE OR #MB_COMM_LOAD_DB.ERROR THEN
#master_REQ := 0;
#return_status := #MB_COMM_LOAD_DB.STATUS;
#Master_times := #Master_times + 1;
END_IF;
END_FUNCTION_BLOCK