PLC的C语言编程

PLC的C语言编程


2024年3月25日发(作者:电脑cpu100%怎么解决)

2、C语言功能块

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

并附有常用函数列表。

2-1.功能概述

2-2.指令形式

2-3.操作步骤

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

2-5.功能块的编辑

2-6.程序举例

2-7.应用要点

2-8.附函数表

2-1、功能概述

XCP新增功能,支持用户在XCP Pro编程软件中利用C语言编写功能块,在需要的地

方进行调用,其最大的优点是支持几乎所有的C语言函数,增强了程序的保密性,同时由

于可进行多处调用和不同文件的调用,大大提高了编程人员的效率。

2-2、指令形式

X0

S1·

S2·S3·

NAME_CD0M0

S1·

:C语言函数功能块名称,由用户自定义。

S2·

:对应C语言函数内字W的起始地址,只能为寄存器D。

S3·

:对应C语言函数内位B的起始地址,只能为内部线圈M。

 适用于XC系列PLC V3.0C及以上版本,XC1、XC3、XC5都支持。

 名称由数字,英文,下划线组成,首字符不能为数字,名称长度需<=9个字符。

 名称不能与PLC内置指令名称冲突,如LD,ADD,SUB,PLSR等。

 名称不能与当前PLC已经存在的函数功能块同名。

2-3、操作步骤

1、打开PLC编辑软件,在左侧的“工程”工具栏内选择“函数功能块”,右击选择“添加

新函数功能块”。

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

功能块命名

编辑者名称

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

主函数名称(为函数功能

块名称.该名称不能随意

修改,必须在编辑窗口进

行修改)

‘{}’之间为C语

WORD W 对应为软元件D

言程序编辑区域

BIT B 对应为软元件M

 参数传递方式: 在梯形图调用时,传入的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;

INT8S;

INT16U

INT16S

INT32U

INT32S

FP32;

FP64;

 预定义的宏:

#define

#define

#define

#define

true

false

TRUE

FALSE

1

0

1

0

//布尔量

//8位无符号整数

//8位有符号整数

//16位无符号整数

//16位有符号整数

//32位无符号整数

//32位有符号整数

//单精度浮点

//双精度浮点

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-bit byte 的讯息与低位元16-bit CRC寄存器异或(Exclusive OR)内。

(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

_LOG10

_SQRT2

_PI

_PIP2

_PIP2x3

数据

(double)0.6931458

(double)2.3459093

(double)1.472421

(double)3.97932384626433832795

(double)1.576663975

(double)4.707491925

说明

2的对数

10的对数

根号2

PI

PI/2

PI*3/2

字符串函数

void * memchr(const void *s, int c, size_t n);

说明

传回s位置开始前n个字元第一次出

现字元c的位置指标.

从位置s2复制n个字元到位置s1,传

回s1.

取代s位置开始前n个字元成为字元

c,传回位置指标s.

连结字串ct到字串s之后.

传回字元c第一次出现在字串s位置

的指标.

比较字串s1和s2.

将字串s1复制到字串s2.

int memcmp(const void *s1, const void *s2, size_t n); 比较位置s1和位置s2的前n个字元.

void * memcpy(void *s1, const void *s2, size_t n);

void * memset(void *s, int c, size_t n);

char * strcat(char *s1, const char *s2);

char * strchr(const char *s, int c);

int strcmp(const char *s1, const char *s2);

char * strcpy(char *s1, const char *s2);

双精度数学函数

double acos(double x);

double asin(double x);

double atan(double x);

单精度数学函数

float acosf(float x);

float asinf(float x);

float atanf(float x);

反余弦函数.

反正弦函数.

反正切函数.

说明

double atan2(double y, double

float atan2f(float y, float x); 参数y/x的反正切函数值.

x);

double ceil(double x);

double cos(double x);

double cosh(double x);

double exp(double x);

double fabs(double x);

double floor(double x);

float ceilf(float x);

float cosf(float x);

float coshf(float x);

float expf(float x);

float fabsf(float x);

float floorf(float x);

传回大於或等於参数x的最小

double整数.

余弦函数.

hyperbolic余弦函数,

cosh(x)=(e^x+e^(-x))/2.

自然数的指数e^x.

传回参数x的绝对值.

传回小於或等於参数x的最大

double整数.

double fmod(double x, double 如果y为非零值,传回浮点数x/y

float fmodf(float x, float y);

y); 的余数.

将参数x的浮点数分解成尾数和

double frexp(double val, int float frexpf(float val, int

指标,x = m*2^exp,传回m值的尾

_far *exp); _far *exp);

数,将指数存入参数exp.

double ldexp(double x, int float ldexpf(float x, int

x乘以2的n次方是x*2^n.

exp); exp);

double log(double x);

double log10(double x);

double modf(double

double *pd);

float logf(float x);

float log10f(float x);

自然对数logx

十为底的对数log10x.

将浮点数x分解成整数和小数部

val, float modff(float val, float

分,传回小数部分,将整数部分存

*pd);

入参数ip.

传回参数x为底,参数y的次方值

x^y.

double pow(double x, double

float powf(float x, float y);

y);

double sin(double x);

double sinh(double x);

double sqrt(double x);

double tan(double x);

double tanh(double x);

float sinf(float x);

float sinhf(float x);

float sqrtf(float x);

float tanf(float x);

float tanhf(float x);

正弦函数.

Hyperbolic正弦函数,

sinh(x)=(e^x-e^(-x))/2.

参数x的平方根.

正切函数.

hyperbolic正切函数,

tanh(x)=(e^x-e^(-x))/(e^2+e^(-x)).

三、运动控制


发布者:admin,转转请注明出处:http://www.yc00.com/xitong/1711336514a1887555.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信