<nobr id="zkazv"></nobr>

      午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
      首頁 新聞 工控搜 論壇 廠商論壇 產(chǎn)品 方案 廠商 人才 文摘 下載 展覽
      中華工控網(wǎng)首頁
        P L C | 變頻器與傳動 | 傳感器 | 現(xiàn)場檢測儀表 | 工控軟件 | 人機(jī)界面 | 運(yùn)動控制
        D C S | 工業(yè)以太網(wǎng) | 現(xiàn)場總線 | 顯示調(diào)節(jié)儀表 | 數(shù)據(jù)采集 | 數(shù)傳測控 | 工業(yè)安全
        電 源 | 嵌入式系統(tǒng) | PC based | 機(jī)柜箱體殼體 | 低壓電器 | 機(jī)器視覺
      如何用威綸通觸摸屏的腳本語言編寫CRC-16/XMODEM校驗函數(shù)
      MOTIONTEK
      收藏本文     查看收藏

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

      由于本人知識有限,文中如有錯誤,請告知。
      作者:semonpic    
      E-Mail: semonping@163.com
      企鵝號 442999791

              筆者最近手上有個威綸通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ù)類型錯誤
                 當(dāng)我改成如下掉用方式就可以了
                  short i=1000
                  short j=1000
                  function(i,j)
        
            好進(jìn)入正題吧,如何寫個CRC校驗函數(shù),其實(shí)根本問題,是如何將一串?dāng)?shù)據(jù)傳給子函數(shù),子函數(shù)將傳過來的數(shù)據(jù)根據(jù)特定算法,運(yùn)算出計算結(jié)果,關(guān)于CRC算法,本文不做論述,只提供代碼。
      我首先想到的是這樣的思路:定義 這樣一個函數(shù) short CRC16(short dat[],short len),用來計算CRC。
      但是卻遇到了上面1中的問題,數(shù)組參數(shù)無法作為函數(shù)的形參,官方也找不到解決方法。
      最后想到的解決方法是在LW存儲區(qū)開辟一塊暫存區(qū)域,將要進(jìn)行CRC計算的數(shù)據(jù)搬運(yùn)到這塊暫存區(qū)域上。再CRC校驗函數(shù)中根據(jù)LW的地址將數(shù)據(jù)取出,進(jìn)行CRC計算。
      如此可解決無法傳遞數(shù)組參數(shù)的問題。操作如下。
              定義  sub short CRC_16(short dataddr, short len)
             參數(shù)說明 short dataddr,dataddr是位于LW暫存區(qū)的起始地址,short len len 數(shù)據(jù)長度。
               下面紅色區(qū)域為重點(diǎn)區(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ù)組來保存要進(jìn)行校驗的數(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

        上面綠色部分是進(jìn)行CRC計算的,這里不做研究。下面來講講紅色部分。紅色部分就是申請數(shù)組空間,然后,將LW,暫存空間的數(shù)據(jù),轉(zhuǎn)移到所申請的數(shù)組中,交給下面計算。
        這里的疑惑是為何要申請數(shù)組,然后在拷貝數(shù)據(jù),這么麻煩,而不是用下面的方式進(jìn)行,下面的算法是每次循環(huán)開始先讀取暫存空間數(shù)據(jù),先不說犧牲時間什么的,最起碼這
      中不用申請上面那128大的數(shù)組。理論可行,但是實(shí)際上確實(shí)錯誤的。其主要GetData和SetData 函數(shù)實(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ù)實(shí)現(xiàn)原理,以及數(shù)據(jù)在LW中存儲方式
      先來說說LW中的數(shù)據(jù)存儲 (吐槽:為何網(wǎng)上關(guān)于這方面的資料很少,幾乎沒有LW存儲空間的詳細(xì)說明)
      目前 筆者使用 軟件 EB8000 V4.65

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

      bit15                             bit0



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

      SetData 當(dāng)用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é)省空間進(jìn)行了特別處理
      理論上b[0]應(yīng)該保存在LW0000,b[1]保存在LW0001.但是實(shí)際上確實(shí)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計算


       

      狀 態(tài): 離線

      會員簡介

      會員代號: semonping
      聯(lián) 系 人: 施勇
      電  話: 020-62840410
      傳  真:
      地  址: 簡上工業(yè)區(qū)
      郵  編: 510515
      主  頁:
       
       
       
      立即發(fā)送詢問信息在線聯(lián)系該技術(shù)文摘廠商:
      用戶名: 密碼: 免費(fèi)注冊為中華工控網(wǎng)會員
      請留下您的有效聯(lián)系方式,以方便我們及時與您聯(lián)絡(luò)

      關(guān)于我們 | 聯(lián)系我們 | 廣告服務(wù) | 本站動態(tài) | 友情鏈接 | 法律聲明 | 不良信息舉報
      工控網(wǎng)客服熱線:0755-86369299
      版權(quán)所有 中華工控網(wǎng) Copyright©2022 Gkong.com, All Rights Reserved

      主站蜘蛛池模板: 久9视频这里只有精品试看| 亚洲AV国产福利精品在现观看| 亚洲伊人精品久视频国产| 亚洲国产在一区二区三区| 1区2区3区4区产品不卡码网站 | 精品无码久久久久久尤物| 潮喷失禁大喷水无码| 久久这里只精品热免费99| 国产熟女一区二区三区蜜臀 | 强插少妇视频一区二区三区| 亚洲一区成人av在线| 亚洲AV日韩AV激情亚洲| 亚洲欧美国产日韩天堂区 | 亚洲天堂一区二区三区四区 | 久久国产精品色av免费看| 无码AV无码免费一区二区| 一本色道婷婷久久欧美| 国产一国产精品免费播放| 国产综合色产在线精品| 另类 专区 欧美 制服| 欲色欲色天天天www| 国产偷自视频区视频| 亚洲精品乱码久久观看网| 夜夜春久久天堂亚洲精品| 国产一区二区三区综合视频| 国产成人午夜福利院| 亚洲伊人久久综合成人| 国产资源精品中文字幕| 欧美色欧美亚洲高清在线视频| 精品一区二区不卡无码AV| 丁香五月婷激情综合第九色| 日本中文字幕有码在线视频| 一区二区三区四区五区黄色 | 亚洲欧美人成网站在线观看看| 中文字幕精品av一区二区五区| 国产一级老熟女自拍视频| 国产精品VA尤物在线观看| 国产老熟女国语免费视频| 国产农村老熟女国产老熟女| 国产一区在线播放av| 26uuu另类亚洲欧美日本|