資源簡介
ModBus軟件開發實戰指南PDF , 清華大學出版社,楊更更。著重講述了如何快速入門并精通ModBus軟件開發技術, 適用于初學ModBus通信協議的讀者。包含重點內容標記以及純手打的RTU模式下的源碼。
代碼片段和文件信息
#include?
#ifndef?_MSC_VER
#include?
#endif
#include?
#include?
#include?
#include?“modbus.h“????????????//引用libmodbus庫
/*The?goal?of?this?program?is?to?check?all?major?functions?of?libmodbus:
-write_coil
-read_bits
-write_coils
-write_register
-read_register
-write_registers
-read_registers
All?these?functions?are?called?with?random?values?on?a?address?range?
defined?by?the?following?defines.
*/
#define?LOOP 1
#define?SERVER_ID 17
#define?ADDRESS_START???????0
#define?ADDRESS_END 99
/*?At?each?loop?the?program?works?in?the?range?ADDRESS_START?to?*ADDRESS_END
then?ADDRESS_START?+?1?to?ADDRESS_END?and?so?on.
*/
int?main(void)
{
modbus_t?*ctx;
int?rc;
int?nb_fail;
int?nb_loop;
int?addr;
int?nb;
uint8_t??*tab_rq_bits;????????????????//用于保存發送或接收的數據(下同)
uint8_t??*tab_rp_bits;
uint16_t?*tab_rq_registers;
uint16_t?*tab_rw_rq_registers;
uint16_t?*tab_rp_registers;
/*RTU*/
ctx?=?modbus_new_rtu(“COM3“?19200?‘N‘?8?1);???//創建一個RTU類型的容器
modbus_set_slave(ctx?SERVER_ID);?????????????????//設置從端地址
modbus_set_debug(ctx?TRUE);??????????????????????//設置debug模式
if(modbus_connect(ctx)?==?-1)
{
fprintf(stderr?“Connection?failed:?%s\n“
modbus_strerror(errno));
modbus_free(ctx);
return?-1;
}
/*Allocate?and?initialize?the?different?memory?spaces*/
nb?=?ADDRESS_END?-?ADDRESS_START;??????????? ??//計算需測試的寄存器個數
//以下申請內存塊用以保存和接收各數據
tab_rq_bits?=?(uint8_t?*)malloc(nb?*?sizeof(uint8_t));
memset(tab_rq_bits?0?nb?*?sizeof(uint8_t));
tab_rp_bits?=?(uint8_t?*)malloc(nb?*?sizeof(uint8_t));
memset(tab_rp_bits?0?nb?*?sizeof(uint8_t));
tab_rq_registers?=?(uint16_t?*)malloc(nb?*?sizeof(uint16_t));
memset(tab_rq_registers?0?nb?*?sizeof(uint16_t));
tab_rp_registers?=?(uint16_t?*)malloc(nb?*?sizeof(uint16_t));
memset(tab_rp_registers?0?nb?*?sizeof(uint16_t));
tab_rw_rq_registers?=?(uint16_t?*)malloc(nb?*?sizeof(uint16_t));
memset(tab_rw_rq_registers?0?nb?*?sizeof(uint16_t));
nb_loop?=?nb_fail?=?0;
while(nb_loop++? {
//從起始地址開始順序測試
for(addr?=?ADDRESS_START;?addr? {
int?i;
//生成隨機數用于測試
for(i?=?0;?i? {
tab_rq_registers[i]?=
(uint16_t)(65535.0?*?rand()?/?(RAND_MAX?+?1.0));
tab_rw_rq_registers[i]?=?~?tab_rq_registers[i];
tab_rq_bits[i]?=?tab_rq_registers[i]?%?2;
}
nb?=?ADDRESS_END?-?addr;
/*測試線圈寄存器的單個讀寫*/
rc?=?modbus_write_bit(ctx?addr?tab_rq_bits[0]);???//寫線圈寄存器
if(rc?!=?1?)
{
printf(“ERROR?modbus_write_bit?(%d)\n“?rc);
printf(“Address?=%d?value?=%d\n“?addr?tab_rq_bits[0]);
nb_fail++;
}
else
{
//寫入之后再讀取比較
rc?=?modbus_read_bits(ctx?addr?1?tab_rp_bits);
if(rc?!=?1?||?tab_rq_bits[0]?!=?tab_rp_bits[0])
{
printf(“ERROR?modbus_read_bits?single?(%d)\n“?rc);
printf(“adress?=?%d\n“?addr);
nb_fai
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????97503924??2018-10-11?17:08??ModBus軟件開發實戰指南\ModBus軟件開發實戰指南.pdf
?????目錄???????????0??2018-10-11?17:18??ModBus軟件開發實戰指南\RTU模式源碼(純手打)\
?????文件????????7725??2018-10-11?16:35??ModBus軟件開發實戰指南\RTU模式源碼(純手打)\TestRtuMaster.c
?????文件????????1549??2018-10-11?17:00??ModBus軟件開發實戰指南\RTU模式源碼(純手打)\TestRtuSlave.c
?????目錄???????????0??2018-10-11?17:19??ModBus軟件開發實戰指南\
評論
共有 條評論