西门子SCL编程:SCL实现modbus多从站通讯

6 篇文章 2 订阅

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值