有一台称重仪表,通讯接口是RS485(四线制的),支持的通讯方式是自由口通讯,需要发送指令,才能够返回称重数据。比如输入指令MSV?;,则返回当前的重量数据;
硬件为S7-1212C和CM1241(RS422/485),在连接仪表前,已经和串口助手测试过。
仪表通讯参数设置为波特率9600,8N1
写好程序后,一直报错7000和7002,错误提示为块空闲和中间调用:数据传输运行;
程序如下: // 先将格式指令和获取重量指令定义好,初次扫描的时候将格式指令发送给仪表,定义通讯 的格式,然后用一个10Hz的脉冲去发送重量指令,当重量指令发送完成之后,完成位为1;
REGION 初始化
"自由口通讯数据块".send_buffer_cof := 'cof009;'; //设置数据格式;
"自由口通讯数据块".send_length_cof := 7; //指令长度为7个字符;
"自由口通讯数据块".send_buffer_msv := 'msv?;'; //读取当前重量;
"自由口通讯数据块".send_length_msv := 5; //指令长度为5个字符;
END_REGION
REGION 进行格式设置
"Send_P2P_DB"(REQ:="FirstScan", //通电初始化一次
BUFFER:="自由口通讯数据块".send_buffer_cof,
"PORT":="Local~CM_1241_(RS422_485)_1",
LENGTH:="自由口通讯数据块".send_length_cof,
DONE=>"send_done",
STATUS=>"send_status")
;
END_REGION
REGION 读取重量
"Send_P2P_DB_2"(REQ:="Clock_10Hz", //10Hz的脉冲;
"PORT":="Local~CM_1241_(RS422_485)_1", //本地串口,串口号为269;
BUFFER:="自由口通讯数据块".send_buffer_msv, //发送Ascii格式的字符串指令;
LENGTH:="自由口通讯数据块".send_length_msv, //指令长度为5
DONE=>"rec_done_msv", //发送完成的状态位
STATUS=>"rec_status_msv"); //错误代码
END_REGION
REGION 返回重量结果
IF "rec_done_msv" THEN //当发送完成状态位为1时,开始接受重量信息
"Receive_P2P_DB"("PORT" := "Local~CM_1241_(RS422_485)_1",
BUFFER := "自由口通讯数据块".rec_buffer_msv, //接收Ascii格式的字符串指令;
NDR => "rec_done", //接收完成状态位
ERROR => "rec_error",
STATUS => "rec_status"); //错误代码
END_IF;
END_REGION