PLC的C语言编程Word文件下载.docx
《PLC的C语言编程Word文件下载.docx》由会员分享,可在线阅读,更多相关《PLC的C语言编程Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
![PLC的C语言编程Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/30/dad61ec7-ce1b-4c22-8575-505e6fef38bd/dad61ec7-ce1b-4c22-8575-505e6fef38bd1.gif)
●参数W:
表示字软元件,使用时按数组使用,如W[0]=1;
W[1]=W[2]+W[3];
在程序中可按照标准C规范使用。
●参数B:
表示位软元件,使用时也按数组使用,支持位置1和位清零,如B[0]=1;
B[1]=0;
以及赋值,如B[0]=B[1]。
●双字运算:
在W前加个D,如DW[10]=100000,表示给W[10]W[11]合成的双字赋值。
●浮点运算:
支持在函数中定义浮点变量,以及进行浮点运算。
●函数库:
用户功能块可以直接使用函数库中定义的函数和常量,函数库中包含的函数和常量见后附部分。
●支持的其他数据类型:
BOOL;
//布尔量
INT8U;
//8位无符号整数
INT8S;
//8位有符号整数
INT16U//16位无符号整数
INT16S//16位有符号整数
INT32U//32位无符号整数
INT32S//32位有符号整数
FP32;
//单精度浮点
FP64;
//双精度浮点
●预定义的宏:
#definetrue1
#definefalse0
#defineTRUE1
#defineFALSE0
2-4、函数的导入、导出
1、导出
(1)功能:
将函数导出为文件,供其他PLC程序导入用。
(2)导出方式
a)可编辑:
将源代码也导出,并保存为文件.再次导入后,可再次编辑
b)不可编辑:
源代码不导出.再次导入后只可使用,无法编辑
2、导入
功能:
导入已存在的函数功能块文件,供该PLC程序使用。
选中函数功能块,右键点击菜单"
从硬盘导入函数功能块文件"
,选择相应文件,按确定即可。
2-5、功能块的编辑
例:
将PLC中寄存器D0,D1相加,然后将值赋给D2;
(1)首先在“工程”工具栏里,新建一个函数功能块,在这里我们把它命名为ADD_2,并且编辑C语言程序。
(2)编辑完之后,点击编译;
、
根据编译信息列表内所显示的信息,我们可以查找修改C语言程序里的语法漏洞。
在这里比较容易的发现程序中W[2]=W[0]+W[1]的后面缺少符号“;
”。
当我们将程序修改后,再次进行编译。
从列表信息里可以确认,在程序里面并没有语法错误。
(3)然后再编写PLC程序,分别赋值十进制数10,20到寄存器D0,D1中,并调用函数功能块ADD_2。
如下所示:
(4)然后将程序下载到PLC当中,运行PLC,并置位M0。
(5)我们可以通过工具栏上的自由监控观察到D2的值变成了30,说明赋值成功了。
2-6、程序举例
●功能:
利用函数功能块计算出CRC校验值。
●CRC校验运算规则如下:
(1)令16-bit寄存器(CRC寄存器)=FFFFH。
(2)将第一个8-bitbyte的讯息与低位元16-bitCRC寄存器异或(ExclusiveOR)内。
(3)右移一位CRC寄存器,将0填入高位元处。
(4)检查右移的值,如果是0,就将第三步的新值存入CRC寄存器内,如果为非0,那么将CRC寄存器的值与A001H异或,将结果存入CRC寄存器内。
(5)重复(3)到(4),将8-bit全部运算完成。
(6)重复
(2)到(5),取下一个8-bit的讯息指令,直到所有讯息指令运算完成。
最后,得到的CRC寄存器的值,即是CRC的校验码。
值得注意的是CRC的校验码必须交换放置与讯息指令的检查码中。
●编辑C语言功能块程序,如下:
●编写PLC梯形图程序,D0:
校验数据的字节个数,D1~D5:
校验数据的内容。
如下:
●下载到PLC里,然后运行,使M0置ON,通过自由监控就会发现寄存器D6,D7内分别存入了CRC校验值的高位与底位。
2-7、应用要点
●使用函数功能块的PLC程序,上传后.该函数功能块无法上传,将出现一个未知指令错误。
●一个函数功能块文件内部,可以写多个子函数,进行相互调用。
●多个函数功能块文件彼此独立,不能相互调用各自拥有的函数。
●函数功能块文件可以调用浮点,算术等C语言库函数,如sin,cos,tan。
2-8、附函数表
默认函数库
常量名
数据
说明
_LOG2
(double)0.693147180559945309417232121458
2的对数
_LOG10
(double)2.3025850929940459010936137929093
10的对数
_SQRT2
(double)1.41421356237309504880168872421
根号2
_PI
(double)3.1415926535897932384626433832795
PI
_PIP2
(double)1.57079632679489661923132169163975
PI/2
_PIP2x3
(double)4.71238898038468985769396507491925
PI*3/2
字符串函数
void*memchr(constvoid*s,intc,size_tn);
传回s位置开始前n个字元第一次出现字元c的位置指标.
intmemcmp(constvoid*s1,constvoid*s2,size_tn);
比较位置s1和位置s2的前n个字元.
void*memcpy(void*s1,constvoid*s2,size_tn);
从位置s2复制n个字元到位置s1,传回s1.
void*memset(void*s,intc,size_tn);
取代s位置开始前n个字元成为字元c,传回位置指标s.
char*strcat(char*s1,constchar*s2);
连结字串ct到字串s之后.
char*strchr(constchar*s,intc);
传回字元c第一次出现在字串s位置的指标.
intstrcmp(constchar*s1,constchar*s2);
比较字串s1和s2.
char*strcpy(char*s1,constchar*s2);
将字串s1复制到字串s2.
双精度数学函数
单精度数学函数
doubleacos(doublex);
floatacosf(floatx);
反余弦函数.
doubleasin(doublex);
floatasinf(floatx);
反正弦函数.
doubleatan(doublex);
floatatanf(floatx);
反正切函数.
doubleatan2(doubley,doublex);
floatatan2f(floaty,floatx);
参数y/x的反正切函数值.
doubleceil(doublex);
floatceilf(floatx);
传回大於或等於参数x的最小double整数.
doublecos(doublex);
floatcosf(floatx);
余弦函数.
doublecosh(doublex);
floatcoshf(floatx);
hyperbolic余弦函数,
cosh(x)=(e^x+e^(-x))/2.
doubleexp(doublex);
floatexpf(floatx);
自然数的指数e^x.
doublefabs(doublex);
floatfabsf(floatx);
传回参数x的绝对值.
doublefloor(doublex);
floatfloorf(floatx);
传回小於或等於参数x的最大double整数.
doublefmod(doublex,doubley);
floatfmodf(floatx,floaty);
如果y为非零值,传回浮点数x/y的余数.
doublefrexp(doubleval,int_far*exp);
floatfrexpf(floatval,int_far*exp);
将参数x的浮点数分解成尾数和指标,x=m*2^exp,传回m值的尾数,将指数存入参数exp.
doubleldexp(doublex,intexp);
floatldexpf(floatx,intexp);
x乘以2的n次方是x*2^n.
doublelog(doublex);
floatlogf(floatx);
自然对数logx
doublelog10(doublex);
floatlog10f(floatx);
十为底的对数log10x.
doublemodf(doubleval,double*pd);
floatmodff(floatval,float*pd);
将浮点数x分解成整数和小数部分,传回小数部分,将整数部分存入参数ip.
doublepow(doublex,doubley);
floatpowf(floatx,floaty);
传回参数x为底,参数y的次方值x^y.
doublesin(doublex);
floatsinf(floatx);
正弦函数.
doublesinh(doublex);
floatsinhf(floatx);
Hyperbolic正弦函数,
sinh(x)=(e^x-e^(-x))/2.
doublesqrt(doublex);
floatsqrtf(floatx);
参数x的平方根.
doubletan(doublex);
floattanf(floatx);
正切函数.
doubletanh(doublex);
floattanhf(floatx);
hyperbolic正切函数,
tanh(x)=(e^x-e^(-x))/(e^2+e^(-x)).
三、运动控制