PLC的C語(yǔ)言編程_第1頁(yè)
PLC的C語(yǔ)言編程_第2頁(yè)
PLC的C語(yǔ)言編程_第3頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、2、C 語(yǔ)言功能塊本章重點(diǎn)介紹 C 語(yǔ)言編輯功能塊的特點(diǎn)、 、編輯、指令調(diào)用、 函數(shù)的存儲(chǔ)、 應(yīng)用要點(diǎn)等,并附有常用函數(shù)列表。2-1功能概述2-2指令形式2-3操作步驟2-4函數(shù)的導(dǎo)入、導(dǎo)出2-5功能塊的編輯2-6程序舉例2-7應(yīng)用要點(diǎn)2-8附函數(shù)表2-1、功能概述XCP 新增功能,支持用戶在 XCP Pro 編程軟件中利用 C 語(yǔ)言編寫功能塊,在需要的地方進(jìn)行調(diào)用,其最大的優(yōu)點(diǎn)是支持幾乎所有的 C 語(yǔ)言函數(shù),增強(qiáng)了程序的保密性,同時(shí)由于可進(jìn)行多處調(diào)用和不同文件的調(diào)用,大大提高了編程人員的效率。2-2、指令形式S1·S2·S3·X0NAME_CD0M0S1

2、3;: C 語(yǔ)言函數(shù)功能塊名稱,由用戶自定義。S2·:對(duì)應(yīng) C 語(yǔ)言函數(shù)內(nèi)字W 的起始地址,只能為寄存器D 。S3·:對(duì)應(yīng) C 語(yǔ)言函數(shù)內(nèi)位B 的起始地址,只能為內(nèi)部線圈M 。適用于 XC系列 PLC V3.0C及以上版本,XC1、XC3、 XC5都支持。名稱由數(shù)字,英文,下劃線組成,首字符不能為數(shù)字,名稱長(zhǎng)度需<=9個(gè)字符。名稱不能與 PLC內(nèi)置指令名稱沖突,如LD,ADD,SUB,PLSR等。名稱不能與當(dāng)前PLC已經(jīng)存在的函數(shù)功能塊同名。2-3、操作步驟1、打開 PLC 編輯軟件,在左側(cè)的“工程”工具欄內(nèi)選擇“函數(shù)功能塊” ,右擊選擇“添加新函數(shù)功能塊” 。2、出

3、現(xiàn)如下對(duì)話框,填寫所要編輯函數(shù)的信息。功能塊命名編輯者名稱3、在新建完成后,會(huì)出現(xiàn)下面的編輯畫面。主函數(shù)名稱(為函數(shù)功能塊名稱該名稱不能隨意修改,必須在編輯窗口進(jìn)行修改) 之間為 C 言程序編輯區(qū)域語(yǔ)WORD W 對(duì)應(yīng)為軟元件BIT B對(duì)應(yīng)為軟元件DM參數(shù)傳遞方式:在梯形圖調(diào)用時(shí),傳入的D和M,即為 W和 B的起始地址。如上圖D0 ,M0開始,則 W0 為 D0,W10 為 D10,B 0為 M0, B10為 M10。如梯形圖中使用的參數(shù)為 D100,M100,則 W0 為 D100,B 0為 M100。因此, 字與位元件的首地址由用戶在PLC程序中設(shè)定。參數(shù) W: 表示字軟元件, 使用時(shí)按數(shù)

4、組使用,如W0=1;W1=W2+W3;在程序中可按照標(biāo)準(zhǔn) C規(guī)范使用。參數(shù) B: 表示位軟元件以及賦值,如B0=B1, 使用時(shí)也按數(shù)組使用,。支持位置1和位清零, 如 B0=1;B1=0;雙字運(yùn)算 :在 W前加個(gè) D,如 DW10=100000,表示給 W10W11 合成的雙字賦值。浮點(diǎn)運(yùn)算 :支持在函數(shù)中定義浮點(diǎn)變量,以及進(jìn)行浮點(diǎn)運(yùn)算。函數(shù)庫(kù): 用戶功能塊可以直接使用函數(shù)庫(kù)中定義的函數(shù)和常量,函數(shù)庫(kù)中包含的函數(shù)和常量見后附部分。支持的其他數(shù)據(jù)類型:BOOL;/ 布爾量INT8U;/8位無(wú)符號(hào)整數(shù)INT8S;/8位有符號(hào)整數(shù)INT16U/16位無(wú)符號(hào)整數(shù)INT16S/16位有符號(hào)整數(shù)INT32

5、U/32位無(wú)符號(hào)整數(shù)INT32S/32位有符號(hào)整數(shù)FP32;/ 單精度浮點(diǎn)FP64;/ 雙精度浮點(diǎn)預(yù)定義的宏:#definetrue1#definefalse0#defineTRUE1#defineFALSE02-4、函數(shù)的導(dǎo)入、導(dǎo)出1、導(dǎo)出(1)功能:將函數(shù)導(dǎo)出為文件,供其他PLC程序?qū)胗谩#?)導(dǎo)出方式a)可編輯 : 將源代碼也導(dǎo)出,并保存為文件再次導(dǎo)入后,可再次編輯b)不可編輯 : 源代碼不導(dǎo)出再次導(dǎo)入后只可使用,無(wú)法編輯2、導(dǎo)入功能:導(dǎo)入已存在的函數(shù)功能塊文件,供該P(yáng)LC程序使用。選中函數(shù)功能塊, 右鍵點(diǎn)擊菜單 " 從硬盤導(dǎo)入函數(shù)功能塊文件 " ,選擇相應(yīng)文件,

6、按確定即可。2-5、功能塊的編輯例: 將 PLC中寄存器D0, D1相加,然后將值賦給D2;(1)首先在“工程”工具欄里,新建一個(gè)函數(shù)功能塊,在這里我們把它命名為編輯 C語(yǔ)言程序。ADD_2,并且(2)編輯完之后,點(diǎn)擊編譯;、編譯信息列表根據(jù)編譯信息列表內(nèi)所顯示的信息,我們可以查找修改 C 語(yǔ)言程序里的語(yǔ)法漏洞。在這里比較容易的發(fā)現(xiàn)程序中 W2=W0+W1 的后面缺少符號(hào)“; ”。當(dāng)我們將程序修改后, 再次進(jìn)行編譯。 從列表信息里可以確認(rèn), 在程序里面并沒有語(yǔ)法錯(cuò)誤。(3)然后再編寫PLC 程序,分別賦值十進(jìn)制數(shù)10,20 到寄存器D0 ,D1 中,并調(diào)用函數(shù)功能塊 ADD_2 。如下所示:(

7、4)然后將程序下載到PLC 當(dāng)中,運(yùn)行PLC ,并置位M0 。(5)我們可以通過(guò)工具欄上的自由監(jiān)控觀察到D2 的值變成了30,說(shuō)明賦值成功了。自由監(jiān)控2-6、程序舉例功能:利用函數(shù)功能塊計(jì)算出CRC校驗(yàn)值。CRC校驗(yàn)運(yùn)算規(guī)則如下:( 1)令 16-bit 寄存器( CRC寄存器) =FFFFH。( 2)將第一個(gè)8-bitbyte的訊息與低位元16-bitCRC寄存器異或(ExclusiveOR)內(nèi)。( 3)右移一位 CRC寄存器,將 0 填入高位元處。( 4)檢查右移的值,如果是 0,就將第三步的新值存入 CRC寄存器內(nèi),如果為非 0,那么將 CRC寄存器的值與 A001H異或,將結(jié)果存入 C

8、RC寄存器內(nèi)。( 5)重復(fù)( 3)到( 4),將 8-bit 全部運(yùn)算完成。( 6)重復(fù)( 2)到( 5),取下一個(gè) 8-bit 的訊息指令, 直到所有訊息指令運(yùn)算完成。 最后,得到的 CRC寄存器的值, 即是 CRC的校驗(yàn)碼。 值得注意的是 CRC的校驗(yàn)碼必須交換放置與訊息指令的檢查碼中。編輯 C語(yǔ)言功能塊程序,如下:編寫 PLC梯形圖程序,D0:校驗(yàn)數(shù)據(jù)的字節(jié)個(gè)數(shù),D1 D5:校驗(yàn)數(shù)據(jù)的內(nèi)容。如下:下載到PLC里,然后運(yùn)行,使M0置ON,通過(guò)自由監(jiān)控就會(huì)發(fā)現(xiàn)寄存器D6,D7內(nèi)分別存入了CRC校驗(yàn)值的高位與底位。2-7、應(yīng)用要點(diǎn)使用函數(shù)功能塊的 PLC程序,上傳后該函數(shù)功能塊無(wú)法上傳,將出現(xiàn)

9、一個(gè)未知指令錯(cuò)誤。一個(gè)函數(shù)功能塊文件內(nèi)部,可以寫多個(gè)子函數(shù),進(jìn)行相互調(diào)用。多個(gè)函數(shù)功能塊文件彼此獨(dú)立,不能相互調(diào)用各自擁有的函數(shù)。函數(shù)功能塊文件可以調(diào)用浮點(diǎn),算術(shù)等C語(yǔ)言庫(kù)函數(shù) , 如 sin,cos,tan。2-8、附函數(shù)表默認(rèn)函數(shù)庫(kù)常量名數(shù)據(jù)說(shuō)明_LOG2(double)0.693534582的對(duì)數(shù)_LOG10(double)2.33792909310的對(duì)數(shù)_SQRT2(double)1.4142421根號(hào) 2_PI(double)3.14932384626433832795PI_PIP2(double)1.5796619235PI/2_PIP2x3(double)4.7123889893

10、96507491925PI*3/2字符串函數(shù)說(shuō)明void* memchr(const void *s, int c, size_t n);傳回 s位置開始前 n個(gè)字元第一次出現(xiàn)字元 c的位置指標(biāo) .intmemcmp(const void *s1, const void *s2, size_t n);比較位置 s1和位置 s2的前 n個(gè)字元 .void* memcpy(void *s1, const void *s2, size_t n);從位置 s2復(fù)制 n 個(gè)字元到位置s1,傳回s1.void* memset(void *s, int c, size_t n);取代 s位置開始前 n個(gè)字元

11、成為字元c,傳回位置指標(biāo) s.char* strcat(char *s1, const char *s2);連結(jié)字串 ct到字串 s之后 .char* strchr(const char *s, int c);傳回字元 c第一次出現(xiàn)在字串s位置的指標(biāo) .intstrcmp(const char *s1, const char *s2);比較字串 s1和 s2.char* strcpy(char *s1, const char *s2);將字串 s1復(fù)制到字串 s2.雙精度數(shù)學(xué)函數(shù)單精度數(shù)學(xué)函數(shù)說(shuō)明double acos(double x);float acosf(float x);反余弦函數(shù)

12、.double asin(double x);float asinf(float x);反正弦函數(shù) .double atan(double x);float atanf(float x);反正切函數(shù) .double atan2(double y, doublefloat atan2f(float y, float x);參數(shù) y/x 的反正切函數(shù)值 .x);double ceil(double x);float ceilf(float x);傳回大於或等於參數(shù)x 的最小double整數(shù) .double cos(double x);float cosf(float x);余弦函數(shù) .double

13、 cosh(double x);float coshf(float x);hyperbolic 余弦函數(shù) ,cosh(x)=(ex+e(-x)/2.double exp(double x);float expf(float x);自然數(shù)的指數(shù) ex.double fabs(double x);float fabsf(float x);傳回參數(shù) x的絕對(duì)值 .double floor(double x);float floorf(float x);傳回小於或等於參數(shù)x 的最大double整數(shù) .double fmod(double x, doublefloat fmodf(float x, fl

14、oat y);如果 y 為非零值 ,傳回浮點(diǎn)數(shù) x/yy);的余數(shù) .doublefrexp(doubleval,intfloat frexpf(floatval,int將參數(shù) x的浮點(diǎn)數(shù)分解成尾數(shù)和指標(biāo) ,x = m*2exp,傳回 m值的尾_far *exp);_far *exp);數(shù) ,將指數(shù)存入?yún)?shù) exp.doubleldexp(doublex,intfloat ldexpf(floatx,intx乘以 2的n次方是 x*2n.exp);exp);double log(double x);float logf(float x);自然對(duì)數(shù) logxdouble log10(double

15、 x);float log10f(float x);十為底的對(duì)數(shù) log10x.doublemodf(doubleval,float modff(floatval, float將浮點(diǎn)數(shù) x分解成整數(shù)和小數(shù)部分 ,傳回小數(shù)部分 ,將整數(shù)部分存double *pd);*pd);入?yún)?shù) ip.doublepow(double x,doublefloat powf(float x, float y);傳回參數(shù) x為底 ,參數(shù) y的次方值y);xy.double sin(double x);float sinf(float x);正弦函數(shù) .double sinh(double x);float sinhf(flo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論