找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1668|回復: 3
打印 上一主題 下一主題
收起左側(cè)

STM32f103單片機與威綸通觸摸屏modbus485通訊兼容上位機PLC程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:309610 發(fā)表于 2024-9-8 20:24 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
     最近在改一個數(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)設(shè)置,趨勢圖記錄,
報警記錄,密碼項目,快捷分組,宏指令?勺龊喴啄0迨褂茫挥蠻I設(shè)計不盡如意。拋磚引玉。觸摸屏細節(jié)我會在工控區(qū)另開一貼詳細說明
   接線較簡單可以使用串口轉(zhuǎn)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:驅(qū)動使能,高電平使能發(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;//本設(shè)備的地址
u8 rcbuf[256]; //MODBUS接收緩沖區(qū)
u16 timout;//MODbus的數(shù)據(jù)斷續(xù)時間

通訊測試.png (94.51 KB, 下載次數(shù): 10)

通訊測試.png

歷史.png (49.82 KB, 下載次數(shù): 7)

歷史.png

主屏.png (54.73 KB, 下載次數(shù): 9)

主屏.png

校正分項.png (141.44 KB, 下載次數(shù): 8)

校正分項.png

狀態(tài).png (53.14 KB, 下載次數(shù): 8)

狀態(tài).png

modbus485通訊觸摸屏.7z

11.33 MB, 下載次數(shù): 30, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:344848 發(fā)表于 2024-9-10 16:07 | 只看該作者
沒有看到通訊協(xié)議的內(nèi)容:例如幀頭、幀尾、校驗方式等信息。
回復

使用道具 舉報

板凳
ID:309610 發(fā)表于 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;  //修改本設(shè)備相應的寄存器
       
        //以下為回應主機
       
        modbus.Sendbuf[i++]=modbus.myadd;//添加本設(shè)備地址到發(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;  //設(shè)置RS485為發(fā)送模式
       
        for(j=0;j<i;j++)  //發(fā)送緩沖區(qū)中的所有數(shù)據(jù)
        {
         RS485_byte(modbus.Sendbuf[j]);
        }
       
        RS485_RT_0;  //設(shè)置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é)果組合:最終返回時,將高位字節(jié)uchCRCHi左移8位,與低位字節(jié)uchCRCLo合并,形成最終的16位CRC值。
這個方法有效地驗證Modbus通信中的數(shù)據(jù)完整性,一旦接收方計算出的CRC值與附加的CRC碼不一致,就說明數(shù)據(jù)傳輸過程中出現(xiàn)了錯誤。

在 Modbus 通信協(xié)議中,主機與設(shè)備之間通常使用 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 校驗。
總結(jié):
主機與上述代碼進行通信時,通常使用的是 Modbus RTU 模式的 CRC16 校驗。



觸摸屏通訊設(shè)置的485通訊參數(shù)波特率,奇/偶/N效驗,這些都是基本物理傳輸協(xié)議。 與程序中串口設(shè)置對應
        /*USART初始化*/
        USART_InitTypeDef USART_InitStructure;                                        //定義結(jié)構(gòu)體變量
        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);                                //將結(jié)構(gòu)體變量交給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、     效驗碼
       





評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:1062956 發(fā)表于 2024-10-26 10:50 | 只看該作者
請問,威綸通的觸摸屏,采用Modbus ,每個功能碼代表著啥意思,你是怎么知道的,以及相應的寄存器地址是怎么分配的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表