技術(shù)頻道

      自由口模式下PLC與計(jì)算機(jī)的通信

      概述
      ----本例說明如何以自由協(xié)議實(shí)現(xiàn)計(jì)算機(jī)與S7-200的通信,計(jì)算機(jī)作為主站,可以實(shí)現(xiàn)對(duì)PLC從站各寄存器的讀/寫操作。
      ----計(jì)算機(jī)通過COM口發(fā)送指令到PLC的PORT0(或PORT1)口,PLC通過RCV接收指令,然后對(duì)指令進(jìn)行譯碼,譯碼后調(diào)用相應(yīng)的讀/寫子程序?qū)崿F(xiàn)指令要求的操作,并返回指令執(zhí)行的狀態(tài)信息。

      通信協(xié)議
      ----在自由口模式下,通信協(xié)議是由用戶定義的。用戶可以用梯形圖程序調(diào)用接收中斷、發(fā)送中斷、發(fā)送指令(XMT)、接受指令(RCV)來控制通信操作。在自由口模式下,通信協(xié)議完全由梯形圖程序控制。

      指令格式定義

      • 計(jì)算機(jī)每次發(fā)送一個(gè)33字節(jié)長的指令來實(shí)現(xiàn)一次讀/寫操作,指令格式見表1 說明:
        1. 起始字符
          ----起始字符標(biāo)志著指令的開始,在本例中被定義為ASCII碼的"g",不同的PLC從站可以定義不同的起始字符以接收真對(duì)該P(yáng)LC的指令。
        2. 指令類型
          ----該字節(jié)用來標(biāo)志指令的類型,在本例中05H代表讀操作,06H代表寫操作。
        3. 目標(biāo)PLC站地址
          ----目標(biāo)PLC站地址占用指令的B2、B3兩個(gè)字節(jié),以十六進(jìn)制ASCII碼的格式表示目標(biāo)PLC的站地址。
        4. 目標(biāo)寄存器地址
          ----在PLC內(nèi)部可以用4個(gè)字節(jié)來表示一個(gè)寄存器的地址(但不能表示一個(gè)位地址)。前兩個(gè)字節(jié)表示寄存器類型,后兩個(gè)字節(jié)表示寄存器號(hào)。
          00 00(H): I寄存器區(qū)
          01 00(H): Q寄存器區(qū)
          02 00(H): M寄存器區(qū)
          08 00(H): V寄存器區(qū)

          例如:
          IB000的地址可表示為 00 00 00 00(H)
          VB100的地址可表示為 08 00 00 64(H)
        5. 讀/寫字節(jié)數(shù)M
          ----當(dāng)讀命令時(shí),始終讀回從目標(biāo)寄存器開始的連續(xù)8個(gè)字節(jié)的數(shù)據(jù)(轉(zhuǎn)換為十六進(jìn)制ASCII碼后占用16個(gè)字節(jié)),可以根據(jù)自己的需要取用,M可以任意寫入。
          ----當(dāng)寫命令時(shí),M表示的是要寫入數(shù)據(jù)的十六進(jìn)制ASCII碼所占用的字節(jié)數(shù)。例如要寫入1個(gè)字節(jié)的數(shù)據(jù),數(shù)據(jù)在指令中以十六進(jìn)制ASCII碼表示,它將占用2個(gè)字節(jié),此時(shí)應(yīng)向M中寫入"02"。同理,如果要寫入5個(gè)字節(jié)的數(shù)據(jù),M中應(yīng)寫入"0A"。
        6. 要寫入的數(shù)據(jù)
          ----要寫入的數(shù)據(jù)在指令中以十六進(jìn)制ASCII碼的格式表示,占用指令的B14-B29共16個(gè)字節(jié)。數(shù)據(jù)區(qū)必須填滿,但只有前M個(gè)字節(jié)的數(shù)據(jù)會(huì)被寫入目標(biāo)寄存器。一條指令最多可以寫入8個(gè)字節(jié)的數(shù)據(jù)(此時(shí)M中應(yīng)寫入"10",代表十進(jìn)制的16)
        7. BCC校驗(yàn)碼
          ----在傳輸過程中,指令有可能受到任何的干擾而使原來的數(shù)據(jù)信號(hào)發(fā)生扭曲,此時(shí)的指令當(dāng)然是錯(cuò)誤的,為了偵測(cè)指令在傳輸過程中發(fā)生的錯(cuò)誤,接收方必須對(duì)指令作進(jìn)一步的確認(rèn)工作,以防止錯(cuò)誤的指令被執(zhí)行,最簡單的方法就是使用校驗(yàn)碼。BCC校驗(yàn)碼的方法就是將要傳送的字符串的ASCII碼以字節(jié)為單位作異或和,并將此異或和作為指令的一部分傳送出去;同樣地,接收方在接到指令后,以相同的方式對(duì)接收到的字符串作異或和,并與傳送方所送過來的值作對(duì)比,若其值相等,則代表接收到的指令是正確的,反之則是錯(cuò)誤的。
          ----在本例中,bcc為指令B1到B29的異或和,BCC為bcc的十六進(jìn)制ASCII碼。
          ----bcc=B1 xor B2 xor B3 xor B4 xor …… xor B29
        8. 結(jié)束字符
          ----結(jié)束字符標(biāo)志著指令的結(jié)束,在本例中被定義為ASCII碼的"G",不同的PLC從站可以定義不同的結(jié)束字符以接收真對(duì)該P(yáng)LC的指令。
      • PLC在接到上位機(jī)指令后,將發(fā)送一個(gè)21字節(jié)長反饋信息,格式見表2
        說明:
        1. 起始字符
          ----起始字符標(biāo)志著反饋信息的開始,在本例中被定義為ASCII碼的"g",不同的PLC從站可以定義不同的起始字符,這樣上位機(jī)可以根據(jù)信息的起始字符來判斷反饋信息的來源。
        2. 狀態(tài)信息
          ----該字節(jié)包含指令執(zhí)行的狀態(tài)信息,在本例中
          01H 代表 讀取正確
          02H 代表 寫入正確
          03H 代表 BCC校驗(yàn)碼錯(cuò)誤
          04H 代表 指令不合法
        3. 數(shù)據(jù)區(qū)
          ----反饋信息的B3到B18為讀指令所要讀取的數(shù)據(jù),以十六進(jìn)制ASCII碼表示。
        4. BCC校驗(yàn)碼
          ----與上位機(jī)指令中的BCC校驗(yàn)碼類似,它是反饋信息B3到B18的異或和。
        5. 結(jié)束字符
          ----結(jié)束字符標(biāo)志著反饋信息的結(jié)束,在本例中被定義為26H。

      指令中為何要使用ASCII碼
      ----一條指令除包含數(shù)據(jù)外,還包含必要的控制字(起始字符、結(jié)束字符、指令類型等)。如果指令中的數(shù)據(jù)直接以其原本的形式傳輸,則不可避免的會(huì)與指令中的控制字發(fā)生混淆。
      ----例如本例中,指令的起始字符為"g",其ASCII碼值為67H,結(jié)束字符為"G",其ASCII碼值為47H。假設(shè)要寫入的數(shù)據(jù)中也有47H,并且數(shù)據(jù)直接以其原本的形式傳輸,則PLC會(huì)因?yàn)榻邮盏搅藬?shù)據(jù)中的47H而停止接收,這樣PLC接收到的指令將是一個(gè)不完整的非法指令,很可能造成PLC的誤動(dòng)作。
      ----為了避免這種情況的發(fā)生,可以用文本來傳送二進(jìn)制數(shù)據(jù)。通過以16進(jìn)制ASCII碼的格式描述數(shù)據(jù),每個(gè)二進(jìn)制的字節(jié)都可以表示成一對(duì)ASCII編碼,這對(duì)編碼表示這個(gè)字節(jié)的兩個(gè)16進(jìn)制字符。這種格式可以表示任何的數(shù)值,僅僅使用ASCII代碼的30H到39H(表示0到9)和41H到46H(表示A到F)。ASCII碼的其余部分可以用作控制字(起始標(biāo)志、結(jié)束標(biāo)志、指令類型等)。這樣,數(shù)據(jù)中的47H以ASCII碼的形式進(jìn)行傳送就變成了34H 37H 兩個(gè)字節(jié),從而避免了PLC因接收到數(shù)據(jù)中的47H而停止接收的錯(cuò)誤。

      表1 上位機(jī)指令格式

      Byte0起始字符
      Byte1指令類型(讀/寫)
      Byte2目標(biāo)PLC站地址(十六進(jìn)制ASCII碼)
      Byte3
      Byte4目標(biāo)寄存器地址(十六進(jìn)制ASCII碼)
      Byte5
      Byte6
      Byte7
      Byte8
      Byte9
      Byte10
      Byte11
      Byte12讀/寫字節(jié)數(shù)M(十六進(jìn)制ASCII碼)
      Byte13
      Byte14要寫入的數(shù)據(jù)(十六進(jìn)制ASCII碼)
      Byte15
      Byte16
      Byte17
      Byte18
      Byte19
      Byte20
      Byte21
      Byte22
      Byte23
      Byte24
      Byte25
      Byte26
      Byte27
      Byte28
      Byte29
      Byte30BCC校驗(yàn)碼(十六進(jìn)制ASCII碼)
      Byte31
      Byte32結(jié)束字符

      表2 反饋信息格式

      Byte0起始字符
      Byte1狀態(tài)信息
      Byte2數(shù)據(jù)區(qū)(十六進(jìn)制ASCII碼)
      Byte3
      Byte4
      Byte5
      Byte6
      Byte7
      Byte8
      Byte9
      Byte10
      Byte11
      Byte12
      Byte13
      Byte14
      Byte15
      Byte16
      Byte17
      Byte18BCC校驗(yàn)碼(十六進(jìn)制ASCII碼)
      Byte19
      Byte20結(jié)束字符

      PLC程序執(zhí)行過程
      ----PLC在第一次掃描時(shí)執(zhí)行初始化子程序,對(duì)端口及RCV指令進(jìn)行初始化。初始化完成后,運(yùn)行RCV指令使端口處于接受狀態(tài)。
      ----RCV會(huì)將以"g"開頭"G"結(jié)尾的指令保存到接收緩沖區(qū),并同時(shí)產(chǎn)生接收完成中斷。
      ----RCVcomplete中斷服務(wù)程序用來處理接收完成中斷事件,它會(huì)將接收緩沖區(qū)中的十六進(jìn)制ASCII碼還原成數(shù)據(jù)并保存,同時(shí)置位Verify子程序的觸發(fā)條件(M0.1)。 ----Verify子程序首先復(fù)位本身的觸發(fā)條件以防止子程序被重復(fù)調(diào)用,然后求出接收緩沖區(qū)中指令的BCC校驗(yàn)碼并與指令中的BCC校驗(yàn)碼進(jìn)行比對(duì)。如果相等則置BCC碼校驗(yàn)正確的標(biāo)志位(M0.0)為1;如果指令格式正確(指令的結(jié)束標(biāo)志在接收緩沖區(qū)中特定的位置VB133)而BCC碼不相等,則發(fā)送代表BCC校驗(yàn)碼錯(cuò)誤的反饋信息;如果指令格式不正確(VB133中不是指令的結(jié)束標(biāo)志),則返回代表指令格式錯(cuò)誤的反饋信息。
      ----Read子程序的觸發(fā)條件為:指令中的站地址與本機(jī)站地址相符、指令類型為讀指令、BCC檢驗(yàn)碼正確。當(dāng)條件滿足時(shí),Read子程序被執(zhí)行。Read子程序首先禁止RCV,然后將指令所要讀取的數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制ASCII碼并寫入發(fā)送緩沖區(qū)、計(jì)算BCC檢驗(yàn)碼、最后發(fā)送反饋信息。
      ----Write子程序的觸發(fā)條件為:指令中的站地址與本機(jī)站地址相符、指令類型為寫指令、BCC檢驗(yàn)碼正確。當(dāng)條件滿足時(shí),Write子程序被執(zhí)行。Write子程序首先禁止RCV,然后將指令中的數(shù)據(jù)寫入目標(biāo)寄存器,最后發(fā)送代表寫入正確的反饋信息。
      ----PLC每接到一條指令后都會(huì)發(fā)送一條反饋信息,當(dāng)反饋信息發(fā)送完成時(shí),會(huì)產(chǎn)生發(fā)送完成中斷,XMTcomplete中斷服務(wù)程序用來處理發(fā)送完成中斷事件。在XMTcomplete中斷服務(wù)程序中所要執(zhí)行的操作包括:復(fù)位BCC校驗(yàn)碼正確的標(biāo)志位(M0.0);允許RCV;bcc碼寄存器清零;重新裝入用于計(jì)算BCC校驗(yàn)碼的地址指針;接收緩沖區(qū)中存放指令結(jié)束字符的字節(jié)VB133清零(用來判斷下一條指令格式是否正確)。

      PLC寄存器地址分配
      ----此程序占用PLC寄存器的VB100-VB199,內(nèi)部繼電器占用M0.0和M0.1。寄存器地址分配見表3、表4、表5、表6。

      表3 接收緩沖區(qū)

      VB100字符數(shù)
      VB101起始字符Byte0
      VB102指令類型(讀/寫)Byte1
      VB103目標(biāo)PLC站地址(十六進(jìn)制ASCII碼)Byte2
      VB104Byte3
      VB105目標(biāo)寄存器地址(十六進(jìn)制ASCII碼)Byte4
      VB106Byte5
      VB107Byte6
      VB108Byte7
      VB109Byte8
      VB110Byte9
      VB111Byte10
      VB112Byte11
      VB113讀/寫字節(jié)數(shù)M(十六進(jìn)制ASCII碼)Byte12
      VB114Byte13
      VB115要寫入的數(shù)據(jù)(十六進(jìn)制ASCII碼)Byte14
      VB116Byte15
      VB117Byte16
      VB118Byte17
      VB119Byte18
      VB120Byte19
      VB121Byte20
      VB122Byte21
      VB123Byte22
      VB124Byte23
      VB125Byte24
      VB126Byte25
      VB127Byte26
      VB128Byte27
      VB129Byte28
      VB130Byte29
      VB131BCC校驗(yàn)碼(十六進(jìn)制ASCII碼)Byte30
      VB132Byte31
      VB133結(jié)束字符Byte32

      表4 譯碼區(qū)

      VB134PLC站號(hào)(ATH from VB103-VB104)
      VB135合成為VD135作為目標(biāo)寄存器的地址指針
      (ATH from VB105-VB112)
      VB136
      VB137
      VB138
      VB139讀/寫字節(jié)數(shù)(ATH from VB113-VB114)
      VB140bcc碼(ATH from VB131-VB132)
      VB141未使用
      VB142
      VB143
      VB144
      VB145
      VB146
      VB147
      VB148
      VB149和成為VD149作為VB102的地址指針
      用以計(jì)算BCC校驗(yàn)碼
      VB150
      VB151
      VB152

      表5 發(fā)送緩沖區(qū)

      VB153字符數(shù)
      VB154起始字符Byte0
      VB155狀態(tài)信息Byte1
      VB156數(shù)據(jù)區(qū)(十六進(jìn)制ASCII碼)Byte2
      VB157Byte3
      VB158Byte4
      VB159Byte5
      VB160Byte6
      VB161Byte7
      VB162Byte8
      VB163Byte9
      VB164Byte10
      VB165Byte11
      VB166Byte12
      VB167Byte13
      VB168Byte14
      VB169Byte15
      VB170Byte16
      VB171Byte17
      VB172BCC校驗(yàn)碼(十六進(jìn)制ASCII碼)Byte18
      VB173Byte19
      VB174結(jié)束字符Byte20

      表6 其它

      VB175合成為VW175
      作為接收時(shí)計(jì)算bcc碼循環(huán)的INDX
      VB176
      VB177合成為VW177
      作為發(fā)送時(shí)計(jì)算bcc碼循環(huán)的INDX
      VB178
      VB179接收數(shù)據(jù)的bcc碼
      VB180發(fā)送數(shù)據(jù)的bcc碼
      VB181合成為VD181作為VB156的地址指針
      (計(jì)算發(fā)送反饋信息的bcc碼時(shí)使用)
      VB182
      VB183
      VB184
      VB185至VB198未使用
      VB199本機(jī)站號(hào)

      程序清單

      主程序:

      NETWORK 1
      LDSM0.1//第一次掃描調(diào)用初始化子程序
      CALLinitialize
      NETWORK 2
      LDB=VB134, VB199 //指令中的站地址與本機(jī)站地址相符
      AB=VB102, 5//指令類型為讀指令
      AM0.0//BCC碼校驗(yàn)正確
      CALLRead//調(diào)用讀子程序
      NETWORK 3
      LDB=VB134, VB199//指令中的站地址與本機(jī)站地址相符
      AB= VB102, 6//指令類型為寫指令
      AM0.0//BCC碼校驗(yàn)正確
      CALLWrite//調(diào)用寫子程序
      NETWORK 4
      LDM0.1//指令接收完成后調(diào)用BCC碼校驗(yàn)子程序
      CALLVerify
      NETWORK 5
      LDSM4.5//當(dāng)端口空閑時(shí)啟動(dòng)RCV
      RCVVB100, 0

      Read子程序:

      NETWORK 1
      LDSM0.0//停止端口0的接收
      RSM87.7, 1
      RM0.0, 1
      RCVVB100, 0
      NETWORK 2
      LDSM0.0//將數(shù)據(jù)寫入發(fā)送緩沖區(qū)
      MOVB 103, VB154
      MOVB1, VB155
      HTA*VD135, VB156, 16
      MOVB26, VB174
      MOVB21, VB153
      NETWORK 3
      LDSM0.0//計(jì)算BCC校驗(yàn)碼
      FORVW177, +1, +16
      NETWORK 4
      LDSM0.0
      XORB*VD181, VB180
      NETWORK 5
      LDSM0.0
      INCDVD181
      NETWORK 6
      NEXT
      NETWORK 7
      LDSM0.0
      HTAVB180, VB172, 2//BCC校驗(yàn)碼寫入發(fā)送緩沖區(qū)
      NETWORK 8
      LDSM4.5//發(fā)送反饋信息
      XMTVB153, 0

      Write子程序:

      NETWORK 1
      LDSM0.0//停止端口0的接收
      RSM87.7, 1
      RM0.0, 1
      RCVVB100, 0
      NETWORK 2
      LDSM0.0//裝入要寫如數(shù)據(jù)源的地址指針
      MOVD&VB115, VD145
      NETWORK 3
      LDSM0.0//寫入數(shù)據(jù)
      ATH*VD145, *VD135, VB139
      NETWORK 4
      LDSM0.0//指令執(zhí)行的反饋信息寫入發(fā)送緩沖區(qū)
      MOVB21, VB153
      MOVB103, VB154
      MOVB2, VB155
      MOVB26, VB174
      NETWORK 5
      LDSM4.5//發(fā)送指令執(zhí)行的反饋信息
      XMTVB153, 0

      Verify子程序:

      NETWORK 1
      LDSM0.0
      RM0.1, 1//復(fù)位verify子程序的執(zhí)行條件
      NETWORK 2
      LDSM0.0//計(jì)算BCC碼
      FORVW175, +1, +29
      NETWORK 3
      LDSM0.0
      XORB*VD149, VB179
      NETWORK 4
      LDSM0.0
      INCDVD149
      NETWORK 5
      NEXT
      NETWORK 6
      LDB=VB179, VB140//當(dāng)BCC碼校驗(yàn)正確時(shí),M0.0置1
      AB=VB133, 71
      SM0.0, 1
      NETWORK 7
      LDB=VB133, 71//BCC碼錯(cuò)誤時(shí)發(fā)送反饋信息
      AB<>VB179, VB140
      MOVB21, VB153
      MOVB103, VB154
      MOVB3, VB155
      MOVB26, VB174
      RSM87.7, 1
      RCVVB100, 0
      XMTVB153, 0
      NETWORK 8
      LDB<>VB133, 71//指令格式錯(cuò)誤或RCV超時(shí)時(shí)發(fā)送反饋信息
      MOVB21, VB153
      MOVB103, VB154
      MOVB4, VB155
      MOVB26, VB174
      RSM87.7, 1
      RCVVB100, 0
      XMTVB153, 0

      Initialize子程序:

      NETWORK 1
      LDSM0.0
      MOVB9, SMB30//0口"9600,N,8,1"
      NETWORK 2
      LDSM0.0//RCV指令初始化
      MOVB16#EC, SMB87
      MOVB103, SMB88
      MOVB71, SMB89
      MOVB+1000, SMW92
      MOVB35, SMB94
      RSM87.2, 1
      NETWORK 3
      LDSM0.0
      ATCHRCVcomplete, 23//連接口0接收完成的中斷
      NETWORK 4
      LDSM0.0
      ATCHXMTcomplete, 9//連接口0發(fā)送完成的中斷
      NETWORK 5
      LDSM0.0
      ENI //中斷允許
      NETWORK 6
      LDSM0.0
      MOVB2, VB199//將本機(jī)站地址裝入寄存器
      NETWORK 7
      LDSM0.0
      MOVB&VB102, VD149//裝入地址指針
      MOVB0, VB179//BCC碼寄存器清零
      MOVB&VB156, VD181//裝入地址指針
      MOVB0, VB180//BCC碼寄存器清零

      RCVcomplete中斷程序

      NETWORK 1
      LDSM0.0
      ATHVB103, VB134, 2//指令譯碼(ASCII碼到十六進(jìn)制)
      ATHVB105, VB135, 8
      ATHVB113, VB139, 2
      ATHVB131, VB140, 2
      SM0.1, 1//置位Verify子程序的觸發(fā)條件
      MOVB0, VB179//BCC碼寄存器清零
      MOVD&VB102, VD149//裝入地址指針

      XMTcomplete中斷程序

      NETWORK 1
      LDSM0.0
      RM0.0, 1//復(fù)位BCC校驗(yàn)碼正確的標(biāo)志位
      SSM87.7, 1//允許口0進(jìn)行接收
      MOVB0, VB179//BCC校驗(yàn)碼寄存器清零
      MOVB0, VB180//BCC校驗(yàn)碼寄存器清零
      MOVD&VB102, VD149//重新裝入地址指針
      MOVD&VB156, VD181
      MOVB0, VB133 //接收緩沖區(qū)中存放指令結(jié)束字符的字節(jié)清零

      freeport.mwp(5.77K)

      說明:此應(yīng)用為西門子公司提供的Beta版,僅供參考,望大家多提寶貴意見!


      文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。

      主站蜘蛛池模板: 国产AV天堂无码一区二区三区| 国产成人精品久久一区二区三区av| 国产99视频精品一区| 亚洲伦理一区二区| 一区二区三区内射美女毛片| 无码国产精成人午夜视频一区二区| 国产爆乳无码一区二区麻豆| 精品国产一区二区三区在线观看 | 国产凸凹视频一区二区| 蜜桃传媒一区二区亚洲AV| 无码人妻aⅴ一区二区三区有奶水| 少妇激情一区二区三区视频| 九九久久99综合一区二区| 国产成人无码一区二区三区在线| 亚洲人AV永久一区二区三区久久| 亚洲AV网一区二区三区| 日韩一区二区三区射精| 激情啪啪精品一区二区| 高清国产精品人妻一区二区| 久久精品午夜一区二区福利| 风间由美在线亚洲一区| 亚洲国产综合无码一区二区二三区 | 日韩aⅴ人妻无码一区二区| 亚洲福利精品一区二区三区| 中文字幕人妻第一区| 高清国产精品人妻一区二区| 精品中文字幕一区在线| 久久精品一区二区三区AV| 夜夜添无码试看一区二区三区 | 一区二区三区视频免费观看| 韩国精品福利一区二区三区 | 亚洲日韩一区二区三区| 久久综合亚洲色一区二区三区| 久久99精品国产一区二区三区| 日韩电影在线观看第一区| 久久精品人妻一区二区三区| 国产一区玩具在线观看| 久久精品国产一区二区三| 2021国产精品一区二区在线| 日韩精品午夜视频一区二区三区| 精品一区二区三区视频在线观看 |