Modbus RTU程序開發解讀

Modbus是很好的串口通信協議,其中RTU協議最爲常用,通過Modbus RTU,我們可以輕鬆讀寫串口信息。

從官網下載libModbus,觀察modbus.h可知關鍵的結構體爲:

typedef struct {
    int nb_bits;
    int nb_input_bits;
    int nb_input_registers;
    int nb_registers;
    uint8_t *tab_bits;
    uint8_t *tab_input_bits;
    uint16_t *tab_input_registers;
    uint16_t *tab_registers;
} modbus_mapping_t;

而在modbus-rtu.h中幾個主要的配置函數都使用了該結構體。

RTU操作的一般步驟爲:

1、用指定的串口新建一個連接,Windows系統下默認的串口爲COM1,Linux系統下默認的串口是/dev/ttyS0;

2、設置頻率,比特位,校驗位,等價位;

3、設置超時時間;

4、讀或者寫操作,注意要先設置Slave:modbus_set_slave(m_modbus, 0);

5、關閉連接,取消設備綁定。

主要的操作函數有:

EXPORT int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest); //讀取串口數據
EXPORT int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest); //讀取輸入端串口數據
EXPORT int modbus_write_bit(modbus_t *ctx, int coil_addr, int status); //指定位置寫操作
EXPORT int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data); //寫多個端口

一個簡單的例子:

int main(int argc, char * argv[])
{

modbus_t * m_modbus;
int i, addr, act;
int ret = 0;
m_modbus = modbus_new_rtu("/dev/ttyS0", 9600, 'N', 8, 1); //波特率9600,比特位8,校驗位1,無等價位
modbus_set_debug(m_modbus, 0); //設置爲1將可以看到調試信息
struct timeval response_timeout;
response_timeout.tv_sec = 1;
response_timeout.tv_usec = 0;
modbus_set_response_timeout(m_modbus,&response_timeout); //設置等待延時時間
if(m_modbus && modbus_connect(m_modbus) == -1) {
printf("\nSorry,fail to connect ttyS0,please check your device's state.\n");
}
else {
printf("Connected to dev!\n");
connected = 1;
}

if(m_modbus == NULL) 
{
printf("No connection,check your device!\n");
return;
}
/* //註釋中的代碼作用是讀取串口的4個端口數據
uint8_t dest[4]; //setup memory for data
uint16_t * dest16 = (uint16_t *) dest;
memset(dest, 0, 4);
*/
modbus_set_slave(m_modbus, 0);
/* //本段註釋代碼給指定端口賦值
ret = modbus_read_bits(m_modbus, 0, 4, dest);
printf("%d\n", ret);
for(i = 0; i < 4 ; i++)
{
printf("\n%d:%4d",i,dest[i]);
}
for(i = 0; i < 4 ; i++)
{
ret = modbus_write_bit(m_modbus, i , 1);
if(ret)
{
printf("成功寫入數據!返回值:%d\n",ret);
}
else
{
printf("寫入數據失敗,返回值:%d",ret);
}
sleep(2);
}
*/
//斷開連接
if(m_modbus) {
modbus_close(m_modbus);
modbus_free(m_modbus);
m_modbus = NULL;
}
printf("Disconnect succeed!\n");
return 0;
}

本資料來源於個人總結,如有轉載,請註明出處,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章