金牌会员
- 积分
- 1181
- 金钱
- 1181
- 注册时间
- 2018-4-13
- 在线时间
- 170 小时
|
楼主 |
发表于 2018-7-25 15:11:42
|
显示全部楼层
本帖最后由 xiatianyun 于 2018-7-25 15:13 编辑
Modbus-RTU主站通讯控制函数:[mw_shl_code=c,true]//Modbus主站通讯控制
//Mb_Addr:从站地址
//bMode:模式0读或1写
//DataAddr:所需从站数据地址
//Num:数据byte长度,可能是读取的元件数量,也可能是写入的元件数量。
//pTr:从站回传数据缓冲区或待发送的赋值数据。
//Data_Addr:元件基址,含元件类型。
void Modbus_Master(uint8_t MbAddr, bool bMode, uint16_t DataAddr, uint16_t Num, uint8_t* pTr)
{
//判断元件类型:HoldReg,标识为4xxxx.
if(DataAddr >= 40000 && DataAddr < 50000)
{
//写操作:连续写多个HoldReg,Func=0x10
if(bMode)
{
MdRTUFunc_0x10(MbAddr, DataAddr, Num, pTr);
}
//读操作:连续写多个HoldReg,Func=0x03
else{
MdRTUFunc_0x03(MbAddr, DataAddr, Num, pTr);
}
}
//判断元件类型:AI,标识为3xxxx.
if(DataAddr >= 30000 && DataAddr < 40000)
{
//3xxxx只支持读操作
if(!bMode)
{
MdRTUFunc_0x04(MbAddr, DataAddr, Num, pTr);
}
}
//判断元件类型:DI,标识为1xxxx.
if(DataAddr >= 10000 && DataAddr < 20000)
{
//1xxxx只支持读操作
if(!bMode)
{
MdRTUFunc_0x02(MbAddr, DataAddr, Num, pTr);
}
}
//判断元件类型:DQ,标识为0xxxx.
if(DataAddr >= 0 && DataAddr < 9999)
{
//强制DQ
if(bMode)
{
MdRTUFunc_0x0F(MbAddr, DataAddr, Num, pTr);
}
//读DQ
else{
MdRTUFunc_0x01(MbAddr, DataAddr, Num, pTr);
}
}
}[/mw_shl_code]
|
|