91美女视频-亚洲免费观看视频-欧美a∨-久热在线视频-日韩黄网站-成av人片在线观看www-久操综合-超碰av在线播放-性欧美欧美巨大69-婷婷二区-av男人的天堂网-中文字幕一区在线播放-玖草在线观看-国产网址在线观看-免费在线不卡av

peteryi
級別: 正式會員
精華主題: 0
發(fā)帖數(shù)量: 6 個
工控威望: 97 點
下載積分: 583 分
在線時間: 2(小時)
注冊時間: 2014-10-28
最后登錄: 2019-07-31
查看peteryi的 主題 / 回貼
樓主  發(fā)表于: 2014-10-28 19:56
最近手上有個威綸通MT6056I的HMI,需要與公司的一款板卡通訊,板卡遵循的是自由協(xié)議,但是采用的校驗方式CRC-16/XMODEM.
這種校驗方式是CRC16校驗方式的一種,但是與MODBUS協(xié)議的CRC16的生成方式不同。威綸通的腳本語言庫中有CRC校驗函數(shù),但是這個校驗
函數(shù)是CRC-16/MODBUS版本的,不能為我所用,所以我計劃自己設(shè)計一個CRC16/XMODEM的函數(shù),然后將這個函數(shù)保存到函數(shù)庫里,以備他用
。由于第一次使用這個屏幕,經(jīng)驗不做,遇到一些困難,但也努力解決了。
        首先不得不吐槽下,威綸通的宏指令說明書寫的太簡單了,在遇到問題的時候,可能無法從指令的說明手冊上找到答案,更多的是自己摸索。比如
自己寫子函數(shù)時就遇到狗血的問題
       1:數(shù)組不能作為函數(shù)參數(shù)
            比如
                        sub short function(char dat[],char len)
            其中 char dat[] 參數(shù)將出錯。
            解決方法,后面有表述
       2: 在調(diào)用子函數(shù)的時候,在函數(shù)的參數(shù)中不能出現(xiàn)常量,只能是變量的方式
           例如我定義了子函數(shù) function( short a,short b)
           調(diào)用方式  function( 1000,1000)  編譯器將會告訴你參數(shù)類型錯誤
           當我改成如下掉用方式就可以了
            short i=1000
            short j=1000
            function(i,j)
  
      好進入正題吧,如何寫個CRC校驗函數(shù),其實根本問題,是如何將一串數(shù)據(jù)傳給子函數(shù),子函數(shù)將傳過來的數(shù)據(jù)根據(jù)特定算法,運算出計算結(jié)果,關(guān)于CRC算法,本文不做論述,只提供代碼。
我首先想到的是這樣的思路:定義 這樣一個函數(shù) short CRC16(short dat[],short len),用來計算CRC。
但是卻遇到了上面1中的問題,數(shù)組參數(shù)無法作為函數(shù)的形參,官方也找不到解決方法。
最后想到的解決方法是在LW存儲區(qū)開辟一塊暫存區(qū)域,將要進行CRC計算的數(shù)據(jù)搬運到這塊暫存區(qū)域上。再CRC校驗函數(shù)中根據(jù)LW的地址將數(shù)據(jù)取出,進行CRC計算。
如此可解決無法傳遞數(shù)組參數(shù)的問題。操作如下。
        定義  sub short CRC_16(short dataddr, short len)
       參數(shù)說明 short dataddr,dataddr是位于LW暫存區(qū)的起始地址,short len len 數(shù)據(jù)長度。
         下面紅色區(qū)域為重點區(qū)域,注意理解。

   sub short CRC_16(short dataddr, short len)
    short i, j
    unsigned short crc_reg = 0x0000
    unsigned short current
    unsigned char dattmp[128]    //申請一定長度的數(shù)組來保存要進行校驗的數(shù)據(jù)。
    GetData(dattmp[0], "Local HMI", LW, dataddr, len)//將暫存區(qū)的數(shù)據(jù)復(fù)制到dattmp中

    len=len-1
    for i = 0 to len
        current = dattmp
        current=current<<8
        crc_reg=crc_reg^current
      
        for j = 1 to 8
      
            if (crc_reg & 0x8000) <> 0 then
                crc_reg = (crc_reg << 1) ^ 0x1021
            else
                crc_reg=crc_reg << 1
            end if
        next
      

    next
    return crc_reg;
end sub

  上面綠色部分是進行CRC計算的,這里不做研究。下面來講講紅色部分。紅色部分就是申請數(shù)組空間,然后,將LW,暫存空間的數(shù)據(jù),轉(zhuǎn)移到所申請的數(shù)組中,交給下面計算。
  這里的疑惑是為何要申請數(shù)組,然后在拷貝數(shù)據(jù),這么麻煩,而不是用下面的方式進行,下面的算法是每次循環(huán)開始先讀取暫存空間數(shù)據(jù),先不說犧牲時間什么的,最起碼這
中不用申請上面那128大的數(shù)組。理論可行,但是實際上確實錯誤的。其主要GetData和SetData 函數(shù)實現(xiàn)原理,以及數(shù)據(jù)在LW中存儲方式不清楚造成的。
sub short CRC_16_2(short dataddr, short len)
    short i, j
    unsigned short crc_reg = 0x0000
    unsigned short current
    unsigned char dattmp
    short addr
    addr=dataddr
    len=len-1
  
    for i = 0 to len

       GetData(dattmp, "Local HMI", LW, addr, 1)
        addr=addr+1
        current = dattmp

        current=current<<8
        crc_reg=crc_reg^current
      
        for j = 1 to 8
      
            if (crc_reg & 0x8000) <> 0 then
                crc_reg = (crc_reg << 1) ^ 0x1021
            else
                crc_reg=crc_reg << 1
            end if
        next
      
    next
    return crc_reg;
end sub



GetData和SetData 函數(shù)實現(xiàn)原理,以及數(shù)據(jù)在LW中存儲方式
先來說說LW中的數(shù)據(jù)存儲 (吐槽:為何網(wǎng)上關(guān)于這方面的資料很少,幾乎沒有LW存儲空間的詳細說明)
目前 筆者使用 軟件 EB8000 V4.65

LW 可理解為計算機的RAM ,掉電數(shù)據(jù)不保存,但是存取速度快。每個存儲單元是16bit。分為高字節(jié) (bit15-bit8)和低字節(jié)(bit7 -bit 0)
bit15                                                            bit0


例如 0x1234 存儲方式為高字節(jié) 0x12 ,低字節(jié)0x34.

SetData 當用SetData 來寫LW中的數(shù)據(jù)的時候,會根據(jù)第一個參數(shù)的類型來指導(dǎo)操作

                    如下程序,這是正常的操作程序。a的類型是short
unsigned short a=0x1234
unsigned char b[2]
unsigned char c
SetData(a, "Local HMI", LW, 0, 1)
GetData(c, "Local HMI", LW, 0, 1)
GetData(b[0], "Local HMI", LW, 0, 2)
TRACE("C = %d", c)                    //c=0x34
TRACE("b[0] = %d", b[0])          //b[0]=0x34
TRACE("b[1] = %d", b[1])         //b[1]=0x12

但是SetData的第一個參數(shù)是第一個char類型的數(shù)組如下
unsigned short a
unsigned char b[2]
b[1]=0x12
b[0]=0x34
SetData(b[0], "Local HMI", LW, 0, 2)
GetData(a, "Local HMI", LW, 0, 1)
TRACE("a = %d", a) //a=0x1234

可以看出,在保存char 型數(shù)據(jù)的時候,為了節(jié)省空間進行了特別處理
理論上b[0]應(yīng)該保存在LW0000,b[1]保存在LW0001.但是實際上確實b[0]保存在 LW0000的低字節(jié),b[1]保存在LW0000的高字節(jié)。

同樣的道理GetData 也遵循相同的操作。

現(xiàn)在能回答為何不能采用第二種子函數(shù)寫法.主要原因是 每次循環(huán)都是讀取一個字的底字節(jié)。高字節(jié)數(shù)據(jù)被丟棄了。
假如寫入內(nèi)存的是b[0]到b[10],則通過下面循環(huán)讀取的是b[0],b[2],b[4].....,請好好體會。
    for i = 0 to len

       GetData(dattmp, "Local HMI", LW, addr, 1)
        addr=addr+1
        current = dattmp
    next

再需要調(diào)用CRC函數(shù)的時候,可用如下的方法操作
        char sendbus[26]

        short lwadd=7000 //lw 暫存區(qū)開始地址
        short len=26        
        SetData(sendbuf[1], "Local HMI", LW, lwadd, len)   //將得計算的數(shù)阻搬到LW7000開始的空間,具體在什么地址,可自己安排,只要注意LW 范                                                                                        //0-9000
        tmp = CRC_16(lwadd, len)                                //CRC計算

版權(quán)申明:本文章由逸創(chuàng)論壇(www.yeecon.com)原創(chuàng),轉(zhuǎn)載請標明出處:http://www.yeecon.com/forum.php?mod=viewthread&tid=74&fromuid=1
(出處: 逸控BBS)

由于本人知識有限,文中如有錯誤,請告知。
作者:semonpic    
E-Mail: semonping@163.com
企鵝號 442999791
[ 此帖被peteryi在2014-10-28 20:45重新編輯 ]

主站蜘蛛池模板: 久久少妇av| 久久国产露脸精品国产 | 久久国产色| 日韩一级生活片 | 一区二区三区视频免费 | 美女av毛片 | 自拍偷拍在线播放 | 免费在线观看高清影视网站 | 亚洲精品美女久久久 | 日本三级一区 | 日本黄色a级片 | 少妇搡bbbb搡bbb搡打电话 | 国内毛片毛片 | 中国一级特黄毛片 | 久久久久亚洲av成人片 | 性久久久久久久久久久 | av电影一区二区三区 | 成人性生生活性生交全黄 | 国产人妻精品久久久久野外 | 国产全是老熟女太爽了 | 在线一级 | 最新中文字幕视频 | 97爱爱视频 | 大黑人交xxx极品hd | 毛片在线免费观看网站 | 日韩亚洲欧美在线观看 | 女同动漫免费观看高清完整版在线观看 | www.亚洲激情 | 精品人妻伦九区久久aaa片 | 国产在线观看无码免费视频 | 国产第一av | 极品久久久久 | 裸体av淫导航 | 亚洲天堂资源 | 日韩视频一区二区 | 献给魔王伊伏洛基亚吧动漫在线观看 | 亚洲 欧美 中文字幕 | 亚洲涩涩涩| 天天舔天天操天天干 | 午夜av一区二区三区 | 国产精品一品二区三区的使用体验 | 桃谷绘里香番号 | 天天色天天草 | 日欧一级片 | 成年人福利 | 亚洲一区精品在线观看 | av导航站| 久久久成人免费视频 | 国产农村乱对白刺激视频 | 人人爱人人澡 | 欧美黑人xxx | 中文在线资源 | 诱惑の诱惑筱田优在线播放 | 爱福利视频网 | 7777久久亚洲中文字幕 | 无码一区二区三区免费 | 久久99在线| 阿v天堂在线 | www网站在线免费观看 | 在线看黄网址 | 欧美一区三区二区在线观看 | 四虎影视在线 | 你懂的视频在线播放 | 欧美日韩在线观看视频 | 国产视频成人 | 黄色在线观看网站 | 免费看一级黄色片 | 超污网站在线观看 | 欧美日韩激情在线观看 | 国产激情在线视频 | 成人免费影片 | 福利在线一区二区 | 亚洲天堂三区 | 特级西西人体 | 成人爱爱免费视频 | 91av久久久| 国产午夜视频在线 | 国模人体私拍xvideos | 日韩免费高清一区二区 | 欧美理论视频 | 91美女片黄 | 中文字幕人成乱码在线观看 | 欧美性受xxx黑人xyx性爽 | 四虎免费观看 | 青青草原在线免费观看视频 | 好吊色视频一区二区 | 白丝一区 | 亚洲午夜久久久久 | 午夜视频在线免费观看 | 性欧美4khd高清极品 | wwwxx国产 | 奇米精品一区二区三区在线观看 | 天天干狠狠操 | 亚洲av少妇一区二区在线观看 | 日韩欧美国产电影 | 强伦轩人妻一区二区电影 | 撸撸在线视频 | 国产人妖在线视频 | 小俊大肉大捧一进一出好爽 |