91黄动漫 I 欧美 日韩 国产 成人 在线 I a级成人毛片 I 农村黄色片 I 男生捅女生的肌肌 I 精品99一区二区三区 I 妃光莉av I 日日夜夜操操 I 性中国古装videossex I 久久不卡av I 美女高潮动态图 I 极品美女开粉嫩精品 I 牛牛精品一区二区 I 91精品福利视频 I 成人刺激视频 I 91国内精品视频 I 中国一级特黄毛片大片 I 校长狠狠挺进校花体内小说 I 欧美激情黄色片 I 欧美久久久一区 I 爱豆国产剧免费观看大全剧苏畅 I 麻豆国产人妻欲求不满谁演的 I 亚洲一区二区在线免费观看视频 I 国产超碰av人人做人人爽 I 精品国产第一国产综合精品 I 久久免费看av I 欧美一区二区三区白人 I 国产精品夫妻激情 I 校花被肉干高h潮不断 I 欧美最猛黑人xxxx黑人表情 I 国产欧美日韩一区二区搜索 I 极品女神露脸呻吟啪啪 I 人人天天久久 I 亚洲动漫在线 I 日本91福利区 I 五月天 桃色 开心 I av在线免费观看国产 I 男人添女人的免费视频 I 夜夜穞天天穞狠狠穞

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

   sub short CRC_16(short dataddr, short len)
    short i, j
    unsigned short crc_reg = 0x0000
    unsigned short current
    unsigned char dattmp[128]    //申請一定長度的數組來保存要進行校驗的數據。
    GetData(dattmp[0], "Local HMI", LW, dataddr, len)//將暫存區的數據復制到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計算的,這里不做研究。下面來講講紅色部分。紅色部分就是申請數組空間,然后,將LW,暫存空間的數據,轉移到所申請的數組中,交給下面計算。
  這里的疑惑是為何要申請數組,然后在拷貝數據,這么麻煩,而不是用下面的方式進行,下面的算法是每次循環開始先讀取暫存空間數據,先不說犧牲時間什么的,最起碼這
中不用申請上面那128大的數組。理論可行,但是實際上確實錯誤的。其主要GetData和SetData 函數實現原理,以及數據在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 函數實現原理,以及數據在LW中存儲方式
先來說說LW中的數據存儲 (吐槽:為何網上關于這方面的資料很少,幾乎沒有LW存儲空間的詳細說明)
目前 筆者使用 軟件 EB8000 V4.65

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


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

SetData 當用SetData 來寫LW中的數據的時候,會根據第一個參數的類型來指導操作

                    如下程序,這是正常的操作程序。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的第一個參數是第一個char類型的數組如下
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 型數據的時候,為了節省空間進行了特別處理
理論上b[0]應該保存在LW0000,b[1]保存在LW0001.但是實際上確實b[0]保存在 LW0000的低字節,b[1]保存在LW0000的高字節。

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

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

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

再需要調用CRC函數的時候,可用如下的方法操作
        char sendbus[26]

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

版權申明:本文章由逸創論壇(www.yeecon.com)原創,轉載請標明出處: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重新編輯 ]

主站蜘蛛池模板: 插日本少妇 | 国产精品99久久久久久动医院 | 婷婷国产一区综合久久精品 | 中国xxxx性自由视频 | 91亚洲精品丁香在线观看 | 青草久久久国产线免观 | 亚洲人成电影在线观看网色 | 一区二区狠狠色丁香久久婷婷 | 国产卡一卡二卡三免费入口 | 一本岛高清乱码2020叶美 | 国产91av视频在线观看 | 国产精品爽爽va在线观看网站 | 日日噜噜噜夜夜狠狠久久蜜桃 | 免费男性肉肉影院 | 国产久草av | 91精品国产丝袜白色高跟鞋 分类 | 中文字幕一区二区三三 | 午夜久久久久久久 | 精品久久久久香蕉网 | 玩弄丰满熟妇xxxxx性视频 | 麻豆精品传媒一二三区艾秋 | 夜夜bb | 激情视频免费在线观看 | 日韩av一区二区在线 | 午夜性爽视频男人的天堂 | 性毛片 | 国产精品久久无码不卡黑寡妇 | 午夜片神马影院福利 | 777人体大胆中国人体哦哦 | 国产亚洲欧美日韩夜色凹凸成人 | 免费女人18毛片a毛片视频 | 最新av片免费网站入口 | 性妲己一级淫片免费放 | 亚洲精品www | 996热re视频精品视频这里 | 国产又粗又硬的视频 | 国产suv精二区 | 日本aⅴ在线观看 | 99国产精品久久久久久久日本竹 | 中文字幕一区二区三区人妻少妇 | 一二三在线视频 | 久久69国产精品久久69软件 | 国产手机av在线 | 波多野结衣在线网站 | 中文字幕第7页 | 乱淫a欧美裸体超级xxxⅹ | 无码av高潮喷水无码专区线 | 亚洲精品不卡av在线播放 | 九色综合狠狠综合久久 | 欧美精品一区二区三 | 亚洲旡码欧美大片 | 那个网站可以看毛片 | 自愉自愉产区二十四区 | 每日在线更新av | 久久不卡国产精品无码 | 日韩一级理论片 | 国产亚洲精品久久久久久动漫 | 亚洲不乱码卡一卡二卡4卡5 | 欧美国产日韩在线观看 | 久久婷香 | 日本乱亲伦视频中文字幕 | 欧美啪啪一区二区 | 99在线视频播放 | 天天爽天天干 | 国语对白做受欧美 | 成人人人人人欧美片做爰 | 国产成人无码av片在线观看不卡 | 久久亚洲成人av | 黄色日批视频 | 秋霞久久国产精品电影院 | 日本黄色免费看 | 国产美女亚洲精品久久久毛片小说 | 夜夜春影院 | 国产又黄又爽胸又大免费视频 | 亚洲精品国产黑色丝袜 | 亚洲日韩成人av无码网站 | 香蕉久久夜色精品国产使用方法 | 拍拍拍产国影院在线观看 | 国产亚洲精品视觉盛宴 | 亚洲精品久久久久久久久毛片直播 | 日韩精品免费一区二区夜夜嗨 | aa国产视频 | 日韩成人在线影院 | 狼人亚洲国内精品自在线 | 亚洲日本乱码一区二区在线二产线 | 国产亚洲一卡2卡3卡4卡老狼 | 你懂的在线观看网址 | 欧美激情亚洲综合 | 国产超碰人人做人人爽av | 好了av四色综合无码久久 | 国产精品成人无码久久久久久 | 夜夜摸日日躁欧美视频 | 最新av在线网站 | 日本韩国在线 | 亚洲成亚洲乱码一二三四区软件 | 狠狠久久永久免费观看 | 无码人妻专区免费视频 | 欧美精品 日韩 | 精品久久久久久无码中文字幕漫画 |