PLC的C语言编程.docx

上传人:b****6 文档编号:4391293 上传时间:2022-12-01 格式:DOCX 页数:13 大小:200.96KB
下载 相关 举报
PLC的C语言编程.docx_第1页
第1页 / 共13页
PLC的C语言编程.docx_第2页
第2页 / 共13页
PLC的C语言编程.docx_第3页
第3页 / 共13页
PLC的C语言编程.docx_第4页
第4页 / 共13页
PLC的C语言编程.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

PLC的C语言编程.docx

《PLC的C语言编程.docx》由会员分享,可在线阅读,更多相关《PLC的C语言编程.docx(13页珍藏版)》请在冰豆网上搜索。

PLC的C语言编程.docx

PLC的C语言编程

PLC的C语言编程

2、C语言功能块

本章重点介绍C语言编辑功能块的特点、、编辑、指令调用、函数的存储、应用要点等,并附有常用函数列表。

2-1.功能概述

 

2-2.指令形式

 

2-3.操作步骤

 

2-4.函数的导入、导出

 

2-5.功能块的编辑

 

2-6.程序举例

 

2-7.应用要点

 

2-8.附函数表

 

2-1、功能概述

XCP新增功能,支持用户在XCPPro编程软件中利用C语言编写功能块,在需要的地方进行调用,其最大的优点是支持几乎所有的C语言函数,增强了程序的保密性,同时由于可进行多处调用和不同文件的调用,大大提高了编程人员的效率。

 

2-2、指令形式

2、出现如下对话框,填写所要编辑函数的信息。

 

 

3、在新建完成后,会出现下面的编辑画面。

 

 

●参数传递方式:

在梯形图调用时,传入的D和M,即为W和B的起始地址。

如上图D0,M0开始,则W[0]为D0,W[10]为D10,B[0]为M0,B[10]为M10。

如梯形图中使用的参数为D100,M100,则W[0]为D100,B[0]为M100。

因此,字与位元件的首地址由用户在PLC程序中设定。

●参数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)).

 

三、运动控制

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1