久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1584|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
     最近在改一個數控電源。主板保留有485通訊端口,無顯示屏 主控stm32f103rc,沒有原通訊協議,就依照電路重寫了程序,加裝oled顯示器和時鐘芯片,編碼器,實現數字控制和庫侖計,通訊,電源各種保護。調試中初期沒寫菜單系統相當頭大。于是就利用modbus485通訊接觸摸屏或串口助手調試。原機485部分為隔離式,使用485方便調試也保證了安全。電源完整代碼暫時不公布。先公布modbus部分與觸摸屏部分。程序可直接使用。程序兼容工控上位機,觸摸屏,PLC。
    觸摸屏例子程序太難找,對初學者很不友好。觸摸屏我是一邊學一邊做,本程序包含一般項目完整功能。主屏顯示,IO狀態,系統設置,趨勢圖記錄,
報警記錄,密碼項目,快捷分組,宏指令。可做簡易模板使用,只有UI設計不盡如意。拋磚引玉。觸摸屏細節我會在工控區另開一貼詳細說明
   接線較簡單可以使用串口轉485模塊,1-2元的模塊很多。485模塊A B 接威綸通觸摸屏 com2的1,2孔   
   我非專業人士用到的知識都是大多來源與論壇,回饋論壇。
    完整單片機代碼在最后
    部分代碼:
    #ifndef _modbus_
#define _modbus_
//發送使能DE 接受使能RE 可短接使用一條線,也可使用2線,
//雙工模塊可不接使能只使用VDD GND RXD TXD


//4810通訊電源主控通訊芯片接線
//   收發芯片為             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:驅動使能,高電平使能發送功能。
#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接收緩沖區
u16 timout;//MODbus的數據斷續時間

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

通訊測試.png

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

歷史.png

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

主屏.png

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

校正分項.png

狀態.png (53.14 KB, 下載次數: 8)

狀態.png

modbus485通訊觸摸屏.7z

11.33 MB, 下載次數: 30, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:309610 發表于 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;//添加本設備地址到發送緩沖區
  modbus.Sendbuf[i++]=0x06;        //添加功能碼到發送緩沖區
  modbus.Sendbuf[i++]=Regadd/256;  //添加寄存器地址的高字節到發送緩沖區
        modbus.Sendbuf[i++]=Regadd%256;  //添加寄存器地址的低字節到發送緩沖區
        modbus.Sendbuf[i++]=val/256;     //添加修改后的值的高字節到發送緩沖區
        modbus.Sendbuf[i++]=val%256;     //添加修改后的值的低字節到發送緩沖區
        crc=crc16(modbus.Sendbuf,i);     //計算CRC校驗碼
        modbus.Sendbuf[i++]=crc/256;     //添加CRC校驗碼的高字節到發送緩沖區
        modbus.Sendbuf[i++]=crc%256;     //添加CRC校驗碼的低字節到發送緩沖區
       
        RS485_RT_1;  //設置RS485為發送模式
       
        for(j=0;j<i;j++)  //發送緩沖區中的所有數據
        {
         RS485_byte(modbus.Sendbuf[j]);
        }
       
        RS485_RT_0;  //設置RS485為接收模式
}
Modbus協議中,CRC16校驗用于檢測通信數據的完整性。它通過對傳輸的數據進行循環冗余校驗(CRC),生成一個16位的校驗碼,附加到數據的末尾,接收方根據相同算法計算CRC碼,判斷數據是否有誤。
CRC校驗方式說明:
1. CRC16多項式:采用的是0xA001,即Modbus協議中常用的CRC16-IBM算法,初始值為0xFFFF。
2. 查表法優化:代碼使用了查表法來提高效率,通過auchCRCHi[]和auchCRCLo[]兩個數組存儲CRC的高位和低位預計算值。這樣避免了逐位移位運算,減少了處理時間。
3. 計算過程:
初始化高位和低位CRC字節為0xFF。
遍歷數據緩沖區的每一個字節,計算出當前CRC字節與當前數據字節異或的索引uIndex。
根據uIndex在auchCRCHi[]和auchCRCLo[]查找對應的高位和低位CRC值,更新uchCRCHi和uchCRCLo。
4. 結果組合:最終返回時,將高位字節uchCRCHi左移8位,與低位字節uchCRCLo合并,形成最終的16位CRC值。
這個方法有效地驗證Modbus通信中的數據完整性,一旦接收方計算出的CRC值與附加的CRC碼不一致,就說明數據傳輸過程中出現了錯誤。

在 Modbus 通信協議中,主機與設備之間通常使用 CRC16 校驗 來確保通信數據的完整性。因此,主機與上面代碼通信時,默認使用的校驗方式也是 CRC16。

具體來說,Modbus 協議有兩種主要的傳輸模式,每種模式的校驗方式不同:

1. Modbus RTU 模式:
使用 CRC 校驗:Modbus RTU(Remote Terminal Unit)是二進制通信格式,使用 CRC16 校驗。如上代碼所示,發送數據時,會計算數據的 CRC16 校驗值,并將其附加在數據幀的末尾。接收方再通過相同的算法計算出 CRC 值,驗證數據是否正確。
2. Modbus ASCII 模式:
使用 LRC 校驗:在 Modbus ASCII 模式下,校驗方式為 LRC(縱向冗余校驗,Longitudinal Redundancy Check)。這是通過對數據幀中的每個字節進行異或運算,生成一個校驗字節。
因此,如果通信采用 Modbus RTU 模式,則使用的是 CRC16 校驗,這也是上述代碼所實現的校驗方式。如果是 Modbus ASCII 模式,則會使用 LRC 校驗。
總結:
主機與上述代碼進行通信時,通常使用的是 Modbus RTU 模式的 CRC16 校驗。



觸摸屏通訊設置的485通訊參數波特率,奇/偶/N效驗,這些都是基本物理傳輸協議。 與程序中串口設置對應
        /*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;        //模式,發送模式和接收模式均選擇
        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


完成物理協議才是軟件協議觸摸屏選擇的是 Modbus RTU 模式也就決定了數據格式,效驗方式為CRC,具體數據協議為標準協議
按標準寫就行了,具體通訊報文分析我提供的文檔內都有
                           威綸通自由協議報文
地址        通訊                       
4x    15      01        03                        00 0F            00 01         B4 09
數字元件    站號1、功能碼03 讀多個寄存器、 地址15 、    數量1、     效驗碼
5x    10      01        03                       00 0A           00 01          A4 08
數字元件    站號1、功能碼03 讀多個寄存器、 地址10 、    數量1、     效驗碼
       





評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线精品视频 | 精品视频在线免费观看 | 色综合99 | 国产精品视频一区二区三区, | 在线免费观看成人 | 97国产爽爽爽久久久 | 免费午夜剧场 | 日韩精品一区中文字幕 | av国产在线观看 | 欧美jizzhd精品欧美巨大免费 | 欧美久久久久久久 | 日韩一区二区三区在线视频 | 国产精品日本一区二区在线播放 | 99小视频| 日韩1区 | 欧美一级毛片在线播放 | 欧美精品一区二区三区在线播放 | 黄色网络在线观看 | 亚洲一区二区在线播放 | 久久久久国色av免费观看性色 | 国产成人一区二区三区 | 成人h动漫精品一区二区器材 | 久久久国产一区 | 欧美一区二区免费 | 亚洲日本免费 | 91手机精品视频 | 一级片免费在线观看 | www.日本三级| 亚洲电影免费 | 国产免费一区二区 | 欧美 日韩 国产 一区 | 成人午夜在线 | 亚洲第一天堂无码专区 | 国产精品日韩高清伦字幕搜索 | 午夜影晥 | 成人福利网站 | 在线免费观看成人 | 国产黄色一级片 | 国产成在线观看免费视频 | 美女黄色在线观看 | 日本成人三级电影 |