標題: STM32f103單片機與威綸通觸摸屏modbus485通訊兼容上位機PLC程序 [打印本頁]
作者: guobaox1981 時間: 2024-9-8 20:24
標題: STM32f103單片機與威綸通觸摸屏modbus485通訊兼容上位機PLC程序
最近在改一個數(shù)控電源。主板保留有485通訊端口,無顯示屏 主控stm32f103rc,沒有原通訊協(xié)議,就依照電路重寫了程序,加裝oled顯示器和時鐘芯片,編碼器,實現(xiàn)數(shù)字控制和庫侖計,通訊,電源各種保護。調(diào)試中初期沒寫菜單系統(tǒng)相當頭大。于是就利用modbus485通訊接觸摸屏或串口助手調(diào)試。原機485部分為隔離式,使用485方便調(diào)試也保證了安全。電源完整代碼暫時不公布。先公布modbus部分與觸摸屏部分。程序可直接使用。程序兼容工控上位機,觸摸屏,PLC。
觸摸屏例子程序太難找,對初學者很不友好。觸摸屏我是一邊學一邊做,本程序包含一般項目完整功能。主屏顯示,IO狀態(tài),系統(tǒng)設置,趨勢圖記錄,
報警記錄,密碼項目,快捷分組,宏指令。可做簡易模板使用,只有UI設計不盡如意。拋磚引玉。觸摸屏細節(jié)我會在工控區(qū)另開一貼詳細說明
接線較簡單可以使用串口轉485模塊,1-2元的模塊很多。485模塊A B 接威綸通觸摸屏 com2的1,2孔
我非專業(yè)人士用到的知識都是大多來源與論壇,回饋論壇。
完整單片機代碼在最后
部分代碼:
#ifndef _modbus_
#define _modbus_
//發(fā)送使能DE 接受使能RE 可短接使用一條線,也可使用2線,
//雙工模塊可不接使能只使用VDD GND RXD TXD
//4810通訊電源主控通訊芯片接線
// 收發(fā)芯片為 ADM2483
// USART1_TXD PA9 Pin6 TXD
// USART1_RXD PA10 Pin3 RXD
// USART1_DE PA0 Pin5 DE
// USART1_RE PA2 Pin4 RE
#include "stm32f10x_conf.h"
#define RS485_DE_1 GPIO_SetBits (GPIOA, GPIO_Pin_0) //DE:驅動使能,高電平使能發(fā)送功能。
#define RS485_DE_0 GPIO_ResetBits(GPIOA, GPIO_Pin_0) //
#define RS485_RE_1 GPIO_SetBits (GPIOA, GPIO_Pin_2) //RE*:接收使能,低電平使能接收功能。
#define RS485_RE_0 GPIO_ResetBits(GPIOA, GPIO_Pin_2) //
#define RS485_RT_0 RS485_RE_0; RS485_DE_0;
#define RS485_RT_1 RS485_RE_1; RS485_DE_1;
typedef struct
{
u8 myadd;//本設備的地址
u8 rcbuf[256]; //MODBUS接收緩沖區(qū)
u16 timout;//MODbus的數(shù)據(jù)斷續(xù)時間
-
通訊測試.png
(94.51 KB, 下載次數(shù): 10)
下載附件
2024-9-8 20:59 上傳
-
歷史.png
(49.82 KB, 下載次數(shù): 7)
下載附件
2024-9-8 20:10 上傳
-
主屏.png
(54.73 KB, 下載次數(shù): 9)
下載附件
2024-9-8 20:08 上傳
-
校正分項.png
(141.44 KB, 下載次數(shù): 8)
下載附件
2024-9-8 20:07 上傳
-
狀態(tài).png
(53.14 KB, 下載次數(shù): 8)
下載附件
2024-9-8 20:07 上傳
-
-
modbus485通訊觸摸屏.7z
2024-9-9 01:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
11.33 MB, 下載次數(shù): 30, 下載積分: 黑幣 -5
作者: donglw 時間: 2024-9-10 16:07
沒有看到通訊協(xié)議的內(nèi)容:例如幀頭、幀尾、校驗方式等信息。
作者: guobaox1981 時間: 2024-9-11 15:37
void Modbud_fun6() //6號功能碼處理
{
u16 Regadd;
u16 val;
u16 i,crc,j;
i=0;
Regadd=modbus.rcbuf[2]*256+modbus.rcbuf[3]; //獲取要修改的寄存器地址
val=modbus.rcbuf[4]*256+modbus.rcbuf[5]; //獲取修改后的值
Reg[Regadd]=val; //修改本設備相應的寄存器
//以下為回應主機
modbus.Sendbuf[i++]=modbus.myadd;//添加本設備地址到發(fā)送緩沖區(qū)
modbus.Sendbuf[i++]=0x06; //添加功能碼到發(fā)送緩沖區(qū)
modbus.Sendbuf[i++]=Regadd/256; //添加寄存器地址的高字節(jié)到發(fā)送緩沖區(qū)
modbus.Sendbuf[i++]=Regadd%256; //添加寄存器地址的低字節(jié)到發(fā)送緩沖區(qū)
modbus.Sendbuf[i++]=val/256; //添加修改后的值的高字節(jié)到發(fā)送緩沖區(qū)
modbus.Sendbuf[i++]=val%256; //添加修改后的值的低字節(jié)到發(fā)送緩沖區(qū)
crc=crc16(modbus.Sendbuf,i); //計算CRC校驗碼
modbus.Sendbuf[i++]=crc/256; //添加CRC校驗碼的高字節(jié)到發(fā)送緩沖區(qū)
modbus.Sendbuf[i++]=crc%256; //添加CRC校驗碼的低字節(jié)到發(fā)送緩沖區(qū)
RS485_RT_1; //設置RS485為發(fā)送模式
for(j=0;j<i;j++) //發(fā)送緩沖區(qū)中的所有數(shù)據(jù)
{
RS485_byte(modbus.Sendbuf[j]);
}
RS485_RT_0; //設置RS485為接收模式
}
Modbus協(xié)議中,CRC16校驗用于檢測通信數(shù)據(jù)的完整性。它通過對傳輸?shù)臄?shù)據(jù)進行循環(huán)冗余校驗(CRC),生成一個16位的校驗碼,附加到數(shù)據(jù)的末尾,接收方根據(jù)相同算法計算CRC碼,判斷數(shù)據(jù)是否有誤。
CRC校驗方式說明:
1. CRC16多項式:采用的是0xA001,即Modbus協(xié)議中常用的CRC16-IBM算法,初始值為0xFFFF。
2. 查表法優(yōu)化:代碼使用了查表法來提高效率,通過auchCRCHi[]和auchCRCLo[]兩個數(shù)組存儲CRC的高位和低位預計算值。這樣避免了逐位移位運算,減少了處理時間。
3. 計算過程:
初始化高位和低位CRC字節(jié)為0xFF。
遍歷數(shù)據(jù)緩沖區(qū)的每一個字節(jié),計算出當前CRC字節(jié)與當前數(shù)據(jù)字節(jié)異或的索引uIndex。
根據(jù)uIndex在auchCRCHi[]和auchCRCLo[]查找對應的高位和低位CRC值,更新uchCRCHi和uchCRCLo。
4. 結果組合:最終返回時,將高位字節(jié)uchCRCHi左移8位,與低位字節(jié)uchCRCLo合并,形成最終的16位CRC值。
這個方法有效地驗證Modbus通信中的數(shù)據(jù)完整性,一旦接收方計算出的CRC值與附加的CRC碼不一致,就說明數(shù)據(jù)傳輸過程中出現(xiàn)了錯誤。
在 Modbus 通信協(xié)議中,主機與設備之間通常使用 CRC16 校驗 來確保通信數(shù)據(jù)的完整性。因此,主機與上面代碼通信時,默認使用的校驗方式也是 CRC16。
具體來說,Modbus 協(xié)議有兩種主要的傳輸模式,每種模式的校驗方式不同:
1. Modbus RTU 模式:
使用 CRC 校驗:Modbus RTU(Remote Terminal Unit)是二進制通信格式,使用 CRC16 校驗。如上代碼所示,發(fā)送數(shù)據(jù)時,會計算數(shù)據(jù)的 CRC16 校驗值,并將其附加在數(shù)據(jù)幀的末尾。接收方再通過相同的算法計算出 CRC 值,驗證數(shù)據(jù)是否正確。
2. Modbus ASCII 模式:
使用 LRC 校驗:在 Modbus ASCII 模式下,校驗方式為 LRC(縱向冗余校驗,Longitudinal Redundancy Check)。這是通過對數(shù)據(jù)幀中的每個字節(jié)進行異或運算,生成一個校驗字節(jié)。
因此,如果通信采用 Modbus RTU 模式,則使用的是 CRC16 校驗,這也是上述代碼所實現(xiàn)的校驗方式。如果是 Modbus ASCII 模式,則會使用 LRC 校驗。
總結:
主機與上述代碼進行通信時,通常使用的是 Modbus RTU 模式的 CRC16 校驗。
通訊設置.png (68.27 KB, 下載次數(shù): 9)
下載附件
2024-9-11 15:23 上傳
通訊設置2 .png (18.87 KB, 下載次數(shù): 12)
下載附件
2024-9-11 15:23 上傳
觸摸屏通訊設置的485通訊參數(shù)波特率,奇/偶/N效驗,這些都是基本物理傳輸協(xié)議。 與程序中串口設置對應
/*USART初始化*/
USART_InitTypeDef USART_InitStructure; //定義結構體變量
USART_InitStructure.USART_BaudRate = 115200; //波特率
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制,不需要
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //模式,發(fā)送模式和接收模式均選擇
USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶校驗,不需要
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位,選擇1位
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長,選擇8位
USART_Init(USART1, &USART_InitStructure); //將結構體變量交給USART_Init,配置USART1
完成物理協(xié)議才是軟件協(xié)議觸摸屏選擇的是 Modbus RTU 模式也就決定了數(shù)據(jù)格式,效驗方式為CRC,具體數(shù)據(jù)協(xié)議為標準協(xié)議
按標準寫就行了,具體通訊報文分析我提供的文檔內(nèi)都有
威綸通自由協(xié)議報文
地址 通訊
4x 15 01 03 00 0F 00 01 B4 09
數(shù)字元件 站號1、功能碼03 讀多個寄存器、 地址15 、 數(shù)量1、 效驗碼
5x 10 01 03 00 0A 00 01 A4 08
數(shù)字元件 站號1、功能碼03 讀多個寄存器、 地址10 、 數(shù)量1、 效驗碼
作者: lushui 時間: 2024-10-26 10:50
請問,威綸通的觸摸屏,采用Modbus ,每個功能碼代表著啥意思,你是怎么知道的,以及相應的寄存器地址是怎么分配的
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
日韩伦理一区二区三区
|
国产成人午夜精品影院游乐网
|
日本久久精品视频
|
国产精品视频免费观看
|
欧美一区2区三区4区公司
|
九久久
|
久久久毛片
|
自拍偷拍第一页
|
一级做a爰片久久毛片免费看
|
国产91精品在线
|
国产精品影视
|
欧美精品中文字幕久久二区
|
玖玖视频网
|
日干夜操
|
在线免费观看亚洲
|
99re视频在线
|
亚洲成人在线网
|
久久最新|
一区二区三区在线免费观看
|
国产国产精品久久久久
|
国产精品成人一区
|
亚洲美乳中文字幕
|
国产精品永久久久久久久www
|
91在线观看免费
|
欧美日韩在线视频一区
|
999国产精品视频
|
一级黄色淫片
|
欧美激情精品久久久久久变态
|
99久久久无码国产精品
|
国产精品99久久久久久大便
|
久久国产精品91
|
国产成人综合久久
|
成人免费看片网
|
成人毛片视频免费
|
91精品综合久久久久久五月天
|
久草免费在线视频
|
久久久久av|
国产一区二区影院
|
四季久久免费一区二区三区四区
|
6996成人影院网在线播放
|
国产精品a级
|