威纶触摸屏软件下载编程-元件-流动块怎么是灰色图标?如何打开

&&&&&&&&威纶触摸屏编程
正在努力加载播放器,请稍等…
正在努力加载播放器
所需财富值:
40文件大小:2.77MB
您当前剩余财富值:&&
大小:2.77MB&&所需金币:50
&& & 金币不足怎么办?
下载量:-次 浏览量:968次
贡献时间: 13:00:00
文档标签:
已有-位用户参与评分
同类热门文档
你可能喜欢
看过这篇文档的还看过
阅读:2959&&下载:9
阅读:869&&下载:5
阅读:409&&下载:4
阅读:300&&下载:3
阅读:898&&下载:1
阅读:194&&下载:1
阅读:184&&下载:0
阅读:760&&下载:0
阅读:245&&下载:0
阅读:77&&下载:0
该用户的其他文档
所需财富值:
50文件大小:2.77MB
您当前剩余财富值:&&
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
举报该文档侵犯版权。
例: http://wenku.it168.com/help.shtml在设计院干设计已经八九年了。但是还是深感水平不足,需要学习的东西还是很多。底子本
下班,你睡得心安理得么?
劳动是财富的源泉,不干活哪有钱拿?
劳动是幸福源泉,
查看: 325|回复: 0
威纶触摸屏
阅读权限10
积分帖子主题
加入海川与三百六十万化工人交流互动(支持手机号、微信一键注册)
才可以下载或查看,没有帐号?
&&各位大侠 有流动管道的视频或程序给学习下么&&感激不尽啊
在线客服QQ&&
网站事务& 6& 广告咨询& &
直播大讲堂& 6& 大连总部& 6& 海川技术研究院(山东)&
&海川天化云&
&(座机工作日09:00--17:00,其它时间可致信电子信箱或在线QQ客服咨询)
三百六十万海川人欢迎您的参与 化工技术交流第一社区,共同学习 共同提高!
版权所有 海川网-海川化工论坛
Discuz!---
本站法律顾问 : 辽宁好谋律师事务所 谢晨曦 主任律师
&&&&&&&&&&当前位置: >>
威纶触摸屏宏指令使用说明
第三十章? 宏指令说明 ..................................................................................................................... 2 30.1 宏指令的结构 .......................................................................................................................... 2 30.2 宏指令的语法 .......................................................................................................................... 4 30.2.1? 常量和变量 ................................................................................................................... 4 30.2.2 运算符 ............................................................................................................................ 7 30.3 语句 ........................................................................................................................................ 10 30.3.1 定义语句 ...................................................................................................................... 10 30.3.2 赋值语句 ...................................................................................................................... 11 30.3.3 逻辑运算语句 .............................................................................................................. 11 30.3.4? 循环语句 ..................................................................................................................... 13 30.3.4 其他控制命令 .............................................................................................................. 15 30.4? 子函数 .................................................................................................................................... 16 30.5 内置函数功能 ........................................................................................................................ 17 30.5.1? 数学运算函数 ............................................................................................................. 18 30.5.2? 数据转换函数 ............................................................................................................. 24 30.5.3? 数据操作函数 ............................................................................................................. 29 30.5.4? 位状态转换 ................................................................................................................. 34 30.5.5? 通讯有关的函数 ......................................................................................................... 37 30.6? 怎样建立和执行宏指令 ........................................................................................................ 52 30.6.1? 怎样建立一个宏指令 ................................................................................................. 52 30.6.2? 执行宏指令 ................................................................................................................. 57 30.7? 使用宏指令时的注意事项 .................................................................................................... 58 30.8? 使用自由协议去控制一个设备 ............................................................................................ 59 30.9? 编译错误提示信息 ................................................................................................................ 67 30.10? 宏指令范例程序 .................................................................................................................. 781 第三十章 宏指令说明宏指令提供了应用程序之外附加的你所需要的功能。在 MT8000 人机界面运行时,宏指令可 以自动的执行这些命令。它可以担负执行譬如复杂的运算、字符串处理,和使用者与工程之 间的交流等功能。本章主要介绍宏指令的语法、如何使用和编程方法等功能。希望通过本章 的说明,能够使各位能够快速的掌握 EB8000 软件提供的强大的宏指令功能。30.1 宏指令的结构宏指令是由各种语句组成的。这些语句包含常数、变量和各种运算符。这些语句放置在特定 的顺序位置以执行后达到一个希望的执行结果。宏指令的结构一般为以下格式:全局变量声明-----------------------------------可选Sub Function Block Declarations(子函数声明) -----------------------------------可选 局部变量声明 End Sub(结束子函数)macro_command main() 局部变量声明 [各式语句][主函数]------------------------------------必须2 end macro_command[结束主函数]------------------------------------必须一个宏指令必须有一个且只有一个主函数,用来开始宏指令的执行。格式为:macro_command 函数名称()end macro_command变量声明必须放在宏指令语句的前面,否则如果语句放置在变量声明的前面,将会造成宏指 令无法编译通过。局部变量一般用在宏指令主函数或者自定义的子函数中。它的合法性只在指定的函数中有 效。 全局变量一般是定义在所有宏指令函数的前面,且它在整个宏指令中均具有有效性。当局部 变量和全局变量被定义为相同的名称时,只有局部变量有效。下面就是一个简单的宏指令,其中就包含了变量声明和功能执行。macro_command main() short pressure = 10 SetData(pressure, &Allen-Bradley DF1&, N7, 0, 1) end macro_command // 局部变量声明// 功能执行3 30.2 宏指令的语法30.2.1 常量和变量30.2.1.1 常量常量是一个可以被各式语句直接使用的固定的数据。有如下格式: 常量类型 十进制整型数 十六进制数 字符型 布尔型 必须以 0x 开头 字符必须使用单引号 使用说明 举例 345, -234, 0, b, 0xffff, 0x237 ‘a’, ‘data’, ‘函数名称’ true, false下面即为一个简单的常量使用的范例。macro_command main() short A, B A = 1234 B = 0x12 // 1234 和 0x12 即为常量 // 声明A和B为短整型变量end macro_command30.2.1.2 变量4 变量是一个代表着各种资料的名称。在宏指令中,这些资料可以随着宏指令语句执行的结果 改变而改变。变量的命名规则1. 必须以英文字母开头 2. 变量名成长度不超过 32 个字符 3. 系统保留寄存器名称不能作为变量名称。下面为 5 种不同的变量类型:变量类型 Bool 布尔型 Char 字符型 Short 短整型 Int 双整型描述 1 bit (一个位) 8 bits (一个字节) 16 bits (一个字) 32 bits (双字) 32 bits (双字)范围 0, 1 ±127 ±32767 ±Float 浮点型变量声明变量必须在使用前声明。所以,在宏指令,所有的变量都必须在语句使用前都被声明完成。 声明变量时,先定义变量的类型,后面再跟着变量名称。如下范例: int short float a b, switch pressure5 数组声明宏指令支持一维数组(下标从 0 开始)。声明数组变量时,先定义数组变量的类型,变量名称, 接着就是该数组变量的个数,变量个数必须放置在“[]”符号中。数组变量的长度为 1~4096。 一个宏指令中只支持 4096 个变量。如下范例: int short float a[10] b[20], switch[30] pressure[15]数组的下标最小为 0,最大下标为(数组的长度-1)如下范例: char data 100] // 数组变量的长度是 100所以: 最小的数组为“data[0]”,最大的数组为“data[99]”,即 100-1=99。变量和数组初始化有两种方法可以让变量初始化: 1. 使用语句中的赋值语句(=)如下范例: int a float b[3]6 a = 10 b[0] = 12. 声明变量时直接赋值 char a = ‘5’, b = 9数组变量的声明是一个特殊的情况。一个完整的数组被初始化时,可以在数组变量声明时, 将数据放置在波形括号“{}”里面,各数据使用逗号分开。如下所示: float data[4] = {11, 22, 33, 44} //这样 data[0] = 11, data[1] = 22….30.2.2 运算符运算符通常被用来指定数据是如何被操作的。在任何一个语句中,运算符左边的变量结果均 依据运算符右边的条件而获得。运算符 =描述 赋值运算符举例 pressure = 10数学运算符 + *描述 加 减 乘7举例 A=B+C A=BCC A=B*C / %除 求余 (返回剩余数)A=B/C A=B%5比较运算符 & &= & &= == &&描述 小于 小于或者等于 大于 大于或者等于 等于 不等于举例 if A & 10 then B = 5 if A &= 10 then B = 5 if A & 10 then B = 5 if A &= 10 then B = 5 if A == 10 then B = 5 if A && 10 then B = 5逻辑运算符 And Or Xor Not描述 与 或 异或 非举例 if A & 10 and B & 5 then C = 10 if A &= 10 or B & 5 then C = 10 if A xor 256 then B = 5 if not A then B = 5移位和位运算符通常被用来操作字符型变量、 短整型变量和双整型变量的位。 在一个语句中, 这些运算符的优先权是在从该语句的左边到右边依此执行的。 即在语句中左边位置的优先执 行,依次从左到右执行。 移位运算符 && && 描述 往左移动指定的位数 往右移动指定的位数8举例 A = B && 8 A = B && 8 位运算符 & | ^ ~描述 位与运算 位或运算 位异或运算 位取反运算举例 A = B & 0xf A=B|C A=B^C A = ~B所有运算符的优先权上述所有运算符的优先权从高到低详细如下所述:位于圆括号里面的运算符最优先 数学运算符 移位和位运算符 比较运算符 逻辑运算符 赋值运算符关键词下面的关键词为宏指令保留使用。 这些均不能用来作为变量名称、 数组名称或者函数名称等。+, -, *, /, %, &=, &, &=, &, &&, ==, and, or, xor, not, &&, &&,=, &, |, ^, ~ exit, macro_command, for, to, down, step, next, return, bool, short, int, char, float, void, if, then, else, break, continue, set, sub, end, while, wend, true, false9 SQRT, CUBERT, LOG, LOG10, SIN, COS, TAN, COT, SEC, CSC, ASIN, ACOS, ATAN, BIN2BCD, BCD2BIN, DEC2ASCII, FLOAT2ASCII, HEX2ASCII, ASCII2DEC, ASCII2FLOAT, ASCII2HEX, FILL, RAND, DELAY, SWAPB, SWAPW, LOBYTE, HIBYTE, LOWORD, HIWORD, GETBIT, SETBITON, SETBITOFF, INVBIT, ADDSUM, XORSUM, CRC, INPORT, OUTPORT, POW, GetError, GetData, GetDataEx, SetData, SetDataEx30.3 语句30.3.1 定义语句这个定义语句包含了变量和数组的声明。正式的格式如下: 类型 名称 当定义一个名称的类型时举例: int A //定义了变量 A 为双整型格式类型 数组名称[数组长度] 当定义数组名称的类型时举例: int B[10] 定义了一维数组变量 B 的长度为 10,类型为双整型10 30.3.2 赋值语句赋值语句使用赋值运算符将赋值运算符右边表达式运算的结果放置到运算符左边的变量中。 一个运算表达式是由变量、常量和各种运算符组成,执行后产生一个新的数据。变量 = 表达式举例 A=2 这样变量 A 就被赋值为 230.3.3 逻辑运算语句逻辑运算语句是根据逻辑(布尔)表达式的结果来执行相应的动作。它的语句如下所示:单行格式 if & Condition & then [Statements] else [Statements] end if举例: if a = = 2 then b=1 else11 b=2 end if区块格式 If & Condition & then [Statements] else if & Condition- n& then [Statements] else [Statements] end if举例: if a = = 2 then b=1 else if a = = 3 b=2 else b=3 end if语法描述: if 必须用在该语句的开始部分12 &Condition&必要条件。 这是一个控制语句。当&Condition&为 0 时,即为“FALES”, (条件为假);当&Condition&为非 0 时,即为“True”(条件为真)。then [Statements]当&Condition&执行为“TRUE”(真)时,必须放置在需要执行的语句之前。 在区块形式中是可选择的参数,在单行形式中,且没有 else 子句时,为必 要参数,该语句在&Condition&为真时执行。else if可选,一条或多条语句,在相对应的&Condition C n&为 true 时执行。&Condition-n& 可选,解释同 Condition else end if 可选,在上述 Condition 和 Condition C n 都不为 true 时执行。 必须。在一个 if-then 语句中使用这个来结束 if-then 语句。30.3.4 循环语句循环语句依据循环条件来反复的执行一个任务。循环语句有两种表达方式。30.3.4.1 for-next 语句For-next 语句通常用来执行次数固定的循环任务。一个变量用作为任务执行次数的计数器和 结束循环任务执行的条件。这个变量为固定执行的次数。语法结构如下:for [Counter] = &StartValue& to &EndValue& [step &StepValue&] [Statements] next [Counter]或者13 for [Counter] = &StartValue& down &EndValue& [step &StepValue&] [Statements] next [Counter]举例: for a = 0 to 10 step 2 b=a next a语法描述: for [Counter] 必须用在该语句的开始部分。 必要,循环计数器的数值变量,该变量的结果用来计数循环的次数。&StartValue& 必要,Counter 的初值。 to/down 必要。用来决定步长是递增还是递减。 This determines if the &step& increments or decrements the &Counter&. “to” 递增 &Counter& by &StepValue&. “down” 递减 &Counter& by &StepValue&. &EndValue& 必要,Counter 的终值。测试点。当&Connter&大于该值时,宏指令将结束这 个循环任务。 step [StepValue] [Statements] next [Counter] 可选,指定&Step Value&的步长,指定为 1 以外的数值。 可选,Counter 的步长,只能是数值,如果没有指定,则预设为 1。 可选,for 和 next 之间的语句区块,该语句区块将执行所指定的次数。 必须的。 可选。14 30.3.4.2 while-wend 语句While-wend 语句是用来执行不确定次数的循环任务。设置一个变量用来判断结束循环的条 件。当条件为“True”时,该语句将一直循环执行直到条件变为“False”。语法结构如下: while &Condition& [Statements] wend举例: while a & 10 a = a + 10 wend语法描述: while continue 必须用在该语句的开始部分。 必要条件。 这是一个控制语句。当为“True”时,开始执行循环命令, 当为“False”时,结束执行循环命令。 return [value] wend 当判断为“TRUE”时,继续执行循环命令。 While-wend 语句的结束标志。30.3.4 其他控制命令break用在 for-next 和 while-wend 语句中。当遇到此语句时,立即跳转到语句的 结束部分。15 continue用在 for-next 和 while-wend 语句中。当遇到此语句时,立即结束当前循环 命令而开始执行下一个循环命令。30.4 子函数使用子函数可以有效的减少循环命令的代码,子函数必须在使用前被定义,且可以使用任何 变量和语句类型。在主函数中,将子函数的参数放置在子函数名称后面的圆括号中,即可调 用子函数。子函数被执行后,将执行后的结果返回到主函数需要的赋值语句或者条件中。其 语法结构如下:sub type &函数名称& [(parameters)] Local variable declarations [Statements] [return [value]] end sub举例: sub int Add(int x, int y) int result result = x +y return result end submacro_command main()16 inta = 10, b = 20, sumsum = Add(a, b) end macro_command语法描述: sub type (parameters) 必须用在该子函数的开始部分。 必须的。用来定义子函数执行后返回的数据类型。 可选。这些参数保留了从主函数传入的数值。这些被传入的参数必须使 用与在参数变量声明的类型一致。 举例: sub int MyFunction(int x, int y). x 和 y 必须为从主函数中传过来 的双整型数据格式的数据。调用此子函数的语句格式大致为这样: ret = MyFunction(456, pressure) 当执行这个子函数后,一个双整型数据将会返回给变量“ret”。 Local variable declaration 除了被传递的参数之外,子函数中使用的变量必须事先声明。在上面的 “举例”中,X 和 Y 就是子函数可以使用的变量。全局变量也可以用在 子函数中。 [Statements] [return [value]] 需要执行的语句。 用来将执行的结果返回给调用语句。这个结果可以是一个常数或者变 量。返回后同时也结束了子函数的执行。 end sub 必须的。用来结束子函数。30.5 内置函数功能EasyBuilder8000 软件宏指令中本身提供了一些内建的函数用来从 PLC 获取数据和传输数据 到 PLC、数据处理和数学运算等。17 30.5.1 数学运算函数函数名称 语法 描述SQRT SQRT(source, result) 开平方根。 数据来源 “source” 可以是常数或者变量, 但是存放结果的 “result” 必须为变量。数据来源必须为一个正数。举例macro_command main() float source, resultSQRT(15, result)source = 9.0 SQRT(source, result)// 执行后result = 3.0end macro_command函数名称 语法 描述SIN SIN(source, result) 三角函数的正弦计算。数据来源“source”可以是常数或者变量,但是存放结 果的“result”必须为变量。举例macro_command main() float source, result18 SIN(90, result)// result is 1source = 30 SIN(source, result)// result is 0.5end macro_command函数名称 语法 描述COS COS(source, result) 三角函数的余弦计算。数据来源“source”可以是常数或者变量,但是存放结 果的“result”必须为变量。举例macro_command main() float source, resultCOS(90, result)// result is 0source = 60 GetData(source, &Local HMI&, LW, 0, 1) COS(source, result)// result is 0.5end macro_command语法名称TAN19 语法 描述TAN(source, result) 三角函数的正切计算。数据来源“source”可以是常数或者变量,但是存放结 果的“result”必须为变量。举例macro_command main() float source, resultTAN(45, result)// result is 1source = 60 TAN(source, result)// result is 1.732end macro_command函数名称 语法 描述COT COT(source, result) 三角函数的余切计算。数据来源“source”可以是常数或者变量,但是存放结 果的“result”必须为变量。举例macro_command main() float source, resultCOT(45, result)// result is 1source = 60 COT(source, result)// result is 0.577420 end macro_command函数名称 语法 描述SEC SEC(source, result) 反三角函数中反正割计算。数据来源“source”可以是常数或者变量,但是存 放结果的“result”必须为变量。举例macro_command main() float source, resultSEC(45, result)// result is 1.414source = 60 SEC(source, result)// if source is 60, result is 2end macro_command函数名称 语法 描述CSC CSC(source, result) 反三角函数中反余割计算。数据来源“source”可以是常数或者变量,但是存 放结果的“result”必须为变量。举例macro_command main() float source, result21 CSC(45, result)// result is 1.414source = 30 CSC(source, result)// result is 2end macro_command函数名称 语法 描述ASIN ASIN(source, result) 反三角函数中反正弦计算。数据来源“source”可以是常数或者变量,但是存 放结果的“result”必须为变量。举例macro_command main() float source, resultASIN(0.8660, result)// result is 60source = 0.5 ASIN(source, result)// result is 30end macro_command函数名称ACOS22 语法 描述ACOS(source, result) 反三角函数中反余弦计算。数据来源“source”可以是常数或者变量,但是存 放结果的“result”必须为变量。举例macro_command main() float source, resultACOS(0.8660, result)// result is 30source = 0.5 ACOS(source, result)// result is 60end macro_command函数名称 语法 描述ATAN ATAN(source, result) 反三角函数中反正切计算。数据来源“source”可以是常数或者变量,但是存 放结果的“result”必须为变量。举例macro_command main() float source, resultATAN(1, result)// result is 45source = 1.732 ATAN(source, result)// result is 6023 end macro_command函数名称 语法 描述RAND RAND(result) 产生一个随即数 存放结果的“result”必须为变量。举例macro_command main() short resultRAND (result)// result is not a fixed value when executes macro every timeend macro_command30.5.2 数据转换函数函数名称 语法 描述BIN2BCD BIN2BCD(source, result) 将 BIN 格式的数据(source)转换为 BCD 格式的数据(result)。 数据来源 “source” 可以是常数或者变量,但是存放结果的“result”必须为变量。举例macro_command main()short source, result24 BIN2BCD(1234, result)// result is 0x1234source = 5678 BIN2BCD(source, result)// result is 0x5678end macro_command函数名称 语法 描述BCD2BIN BCD2BIN(source, result) 将 BCD 格式的数据(source)转换为 BIN 格式的数据(result)。 数据来源 “source” 可以是常数或者变量,但是存放结果的“result”必须为变量。举例macro_command main()short source, resultBCD2BIN(0x1234, result)//result is 1234source = 0x5678 BCD2BIN(source, result)// result is 5678end macro_command25 函数名称 语法 描述DEC2ASCII DEC2ASCII(source, result[start], len) 将十进制的数据(source)转换为 ASCII 格式的数据,并存放在一个一维数组 (result)中。len 表示这个转换后的字符串的长度,同时这个长度也取决于存放 结果的一维数组的数据格式。例如:如果 result 一维数组的格式为“char”, (字符型,长度为一个字节),则长度为“字节数*len”。如果 result 一维数组 的格式为“short”(短整型数据,2 个字节),则长度为“word*len”。依此类 推。 转换后的第一个字符放在 result[start]中,第二个字符放在 result[start+1]中, 最后一个字符放在 result[start+(len-1)]中。 source 和 len 可以是常量或者变量,单数 result 必须为变量。start 也必须为常 数。举例macro_command main() short source char result1[4] short result2[4]source = 5678 DEC2ASCII(source, result1[0], 4) // // result1[0] is '5', result1[1] is '6', result1[2] is '7', result1[3] is '8' the length of the string (result1) is 4 bytes( = 1 * 4)DEC2ASCII(source, result2[0], 4) // // result2[0] is '5', result2[1] is '6', result2[2] is '7', result2[3] is '8' the length of the string (result2) is 8 bytes( = 2 * 4)26 end macro_command函数名称 语法 描述HEX2ASCII HEX2ASCII(source, result[start], len) 十六进制格式数据(source)转换为 ASCII 格式的数据, 并将结果存放在一个一 维数组(result)中。len 表示这个转换后的字符串的长度,同时这个长度也取决 于存放结果的一维数组的数据格式。例如:如果 result 一维数组的格式为 “char”,(字符型,长度为一个字节),则长度为“字节数*len”。如果 result 一维数组的格式为“short”(短整型数据,2 个字节),则长度为“word*len”。 依此类推。 source 和 len 可以是常量或者变量,单数 result 必须为变量。start 也必须为常 数。举例macro_command main() short source char result[4]source = 0x5678 DEC2ASCII(source, result[0], 4) // result[0] is '5', result[1] is '6', result[2] is '7', result[3] is '8'end macro_command27 函数名称 语法 描述ASCII2DEC ASCII2DEC(source[start], result, len) 将字符型 ASCII 数据(source)转换为十进制格式的数据,并存放在 result 变量 中。ASCII 的长度即为 len,第一个字符的位置即为 source[start]的数据。 source 和 len 可以是常量或者变量,单数 result 必须为变量。start 也必须为常 数。举例macro_command main() char source[4] short resultsource[0] = '5' source[1] = '6' source[2] = '7' source[3] = '8'ASCII2DEC(source[0], result, 4) // result is 5678end macro_command函数名称 语法 描述ASCII2HEX ASCII2HEX (source[start], result, len) 将 ASCII 字符型数据(source)转换为十六进制的数据, 并存放在 result 变量中。 字符的长度即为 len 的数据。第一个字符存放在 source[start]中。28 source 和 len 可以是常量或者变量,单数 result 必须为变量。start 也必须为常 数。 举例 macro_command main() char source[4] short resultsource[0] = '5' source[1] = '6' source[2] = '7' source[3] = '8'ASCII2DEC(source[0], result, 4) // result is 0x5678end macro_command30.5.3 数据操作函数函数名称 语法 描述FILL FILL(source[start], preset, count) 依序将预设值(preset)放置到一维数组 source[start]开始的数组中,放置的数据 个数有 count 决定。 source 和 start 必须为变量,preset 可以为一个常量或者变量。举例macro_command main() char result[4] char preset29 FILL(result[0], 0x30, 4) // result[0] is 0x30, result[1] is 0x30, , result[2] is 0x30, , result[3] is 0x30preset = 0x31 FILL(result[0], preset, 2) // result[0] is 0x31, result[1] is 0x31end macro_command函数名称 语法 描述SWAPB SWAPB(source, result) 将一个 16 位字的高低字节颠倒,并将结果存放在 result 变量中。 Source 可以是常量或者是变量,单数 result 必须为变量。举例macro_command main() short source, resultSWAPB(0x5678, result)//result is 0x7856source = 0x123 SWAPB(source, result)// result is 0x2301end macro_command30 函数名称 语法 描述SWAPW SWAPW(source, result) 将一个 32 位双整型数据的高位字和地位字颠倒,并将结果存放在 result 变量 中。 source 可以是常量或者变量,但是 result 必须为变量。举例macro_command main() int source, resultSWAPB(0x, result)//result is 0xsource = 0x12345 SWAPB(source, result)// result is 0xend macro_command函数名称 语法 描述LOBYTE LOBYTE(source, result) 获取一个 16 位数据的低字节,并且放置在 result 变量中。 source 可以是常量或者变量,但是 result 必须为变量。举例macro_command main() short source, resultLOBYTE(0x1234, result)//result is 0x34source = 0x12331 LOBYTE(source, result)//result is 0x23end macro_command函数名称 语法 描述HIBYTE HIBYTE(source, result) 获取一个 16 位数据的高字节,并且放置在 result 变量中。 source 可以是常量或者变量,但是 result 必须为变量。举例macro_command main() short source, resultHIBYTE(0x1234, result)//result is 0x12source = 0x123 HIBYTE(source, result)// result is 0x01end macro_command函数名称 语法 描述LOWORD LOWORD(source, result) 获取一个 32 位数据的低位字,并将结果放置在 result 变量中。 source 可以是常量或者变量,但是 result 必须为变量。举例macro_command main() int source, result32 LOWORD(0x, result)//result is 0x5678source = 0x12345 LOWORD(source, result)// result is 0x2345end macro_command函数名称 语法 描述HIWORD HIWORD(source, result) 获取一个 32 位数据的高位字,并将结果放置在 result 变量中。 source 可以是常量或者变量,但是 result 必须为变量。举例macro_command main() int source, resultHIWORD(0x, result)//result is 0x1234source = 0x12345 HIWORD(source, result)// result is 0x0001end macro_command33 30.5.4 位状态转换函数名称 语法 描述GETBIT GETBIT(source, result, bit_pos) 获取数据或者变量(source)指定的位的状态,并将结果放置在result变量中。 result的数据将为1或者0。 source和bit_pos可以是常量或者变量,但是result必须为变量。举例macro_command main() int source, result short bit_posGETBIT(9, result, 3)// result is 1source = 4 bit_pos = 2 GETBIT(source, result, bit_pos)// result is 1end macro_command函数名称 语法 描述SETBITON SETBITON(source, result, bit_pos) 将数据或者变量(source)指定的位地址设置为1,并将改变后的数据存放在 result变量中。 source和bit-pos可以是常量或者变量,但是result必须为变量。34 举例macro_command main() int source, result short bit_posSETBITON(1, result, 3)// result is 9source = 0 bit_pos = 2 SETBITON (source, result, bit_pos)// result is 4end macro_command函数名称 语法 描述SETBITOFF SETBITOFF(source, result, bit_pos) 将数据或者变量(source)指定的位地址设置为0,并将改变后的数据存放在 result变量中。 source和bit-pos可以是常量或者变量,但是result必须为变量。举例macro_command main() int source, result short bit_posSETBITOFF(9, result, 3)// result is 1source = 435 bit_pos = 2 SETBITFF(source, result, bit_pos)// result is 0end macro_command函数名称 语法 描述INVBIT INVBIT(source, result, bit_pos) 将数据或者变量(source)指定的位地址状态取反,并将改变后的数据存放在 result变量中。 source和bit-pos可以是常量或者变量,但是result必须为变量。举例macro_command main() int source, result short bit_posINVBIT(4, result, 1)//result = 6source = 6 bit_pos = 1 INVBIT(source, result, bit_pos)// result = 4end macro_command36 30.5.5 通讯有关的函数函数名称 语法 描述DELAY DELAY(time) 让宏指令暂停执行,持续的时间至少是指定的这个时间。 time 可以是常量或者变量。举例macro_command main() int time = 500DELAY(100)// DELAY(time)//delay 100 ms delay 500 msend macro_command函数名称 语法 描述ADDSUM ADDSUM(source[start], result, data_count) 将 source[start]到 source[start+data-count-1]的所有一维数组的数据累加起来, 以获得 checksum(校验和),并将结果存放在 result 变量中。 result 必须为变量,data-count 是进行累加的数据的个数,可以是常量或者是 变量。举例macro_command main() char data[5] short checksum37 data[0] = 0x1 data[1] = 0x2 data[2] = 0x3 data[3] = 0x4 data[4] = 0x5 ADDSUM(data[0], checksum, 5)// end macro_command checksum is 0xf函数名称 语法 描述XORSUM XORSUM(source[start], result, data_count) 将 source[start]到 source[start+data-count-1]的所有一维数组的数据进行异或运 算,以获得 checksum(校验和),并将结果存放在 result 变量中。 result 必须为变量,data-count 是进行异或计算的数据的个数,可以是常量或 者是变量。举例macro_command main() char data[5] = {0x1, 0x2, 0x3, 0x4, 0x5} short checksumXORSUM(data[0], checksum, 5)//checksum is 0x1end macro_command函数名称 语法CRC CRC(source[start], result, data_count)38 描述将 source[start]到 source[start+data-count-1]的所有一维数组的数据进 16-bit CRC 计算,以获得 checksum(校验和),并将结果存放在 result 变量中。 result 必须为变量,data-count 是进行计算的数据的个数,可以是常量或者是 变量。举例macro_command main() char data[5] = {0x1, 0x2, 0x3, 0x4, 0x5} short 16bit_CRCCRC(data[0], 16bit_CRC, 5)// 16bit_CRC is 0xbb2aend macro_command函数名称 语法 描述OUTPORT OUTPORT(source[start], device_函数名称, data_count) 将放置在从 source[start]到 source[start+count-1]的所有数据通过串口或者以太 网口传送给 PLC 或者控制器中。 device_函数名称是在“设备列表”中定义的“PLC 名称”,而这个 device 必 须选择为“Free Protocol”这个“PLC 类型”。 data-count 是发送数据的个数,可以是常量或者是变量。举例要使用 OUTPORT 函数,必须要在“PLC 类型”中选择“PLC 类型”为“Free Protocol”,如下图所示。39 这里的 device-函数名称即为“MODBUD RTU Device”。端口的属性也是依 据在这个“系统参数”中的设定,譬如,在此设定为(9600,E,8,1…)下面是一个范例程序,使用自由协议,以 MODBUS RTU 的协议格式,将单 个寄存器设置为 ON。macro_command main()char command[32] short address, checksumFILL(command[0], 0, 32)// 初始化命令40 command[0] = 0x1// 站号 command[1] = 0x5// 功能码 : 写单个位address = 0 HIBYTE(address, command[2]) LOBYTE(address, command[3])command[4] = 0xff// 使该bit设置为ON command[5] = 0CRC(command[0], checksum, 6)LOBYTE(checksum, command[6]) HIBYTE(checksum, command[7])//将命令通过串口送出去OUTPORT(command[0], &MODBUS RTU Device&, 8)end macro_command函数名称 语法 描述INTPORT INPORT(read_data[start], device_函数名称, read_count, return_value) 从串口或者以太网口读数据到人机界面上。这些数据保存在 read-data[start]~read-data[start+read-count-1]这个一维数组中。 同样的, device_h 函数名称见上面的说明,在此不再详述。41 read-count 是设定的需要读取的命令的字节长度, 它可以是一个常数也可以是 一个变量。如果这个函数能够成功的从 PLC 或者控制器中读取到数据,则 return_value 的值为 1,否则就为 0。 举例 下面就是一个使用 INPORT 函数读取一个 MODBUS 设备保持寄存器数据的 范例。//读取保持寄存器数据macro_command main() char command[32], response[32] short address, checksum short read_no, return_value, read_data[2]FILL(command[0], 0, 32)// 命令初始化 FILL(response[0], 0, 32)command[0] = 0x1// 站号 command[1] = 0x3// 功能码 :03Haddress = 0 HIBYTE(address, command[2]) LOBYTE(address, command[3])read_no = 2//read 2 words (4x_1 and 4x_2)HIBYTE(read_no, command[4]) LOBYTE(read_no, command[5])42 CRC(command[0], checksum, 6)LOBYTE(checksum, command[6]) HIBYTE(checksum, command[7])//使用OUTPORT函数将命令送出去OUTPORT(command[0], &MODBUS RTU Device&, 8)//使用INPORT函数读取返回的命令INPORT(response[0], &MODBUS RTU Device&, 9, return_value)if return_value & 0 then read_data[0] = response[4] + (response[3] && 8)// data in 4x_1 read_data[1] = response[6] + (response[5] && 8)// data in 4x_2SetData(read_data[0], &Local HMI&, LW, 100, 2) end ifend macro_command函数名称 语法GetData GetData(read_data[start], device_函数名称, device_type, address_offset, data_count) or43 GetData(read_data, device_函数名称, device_type, address_offset, 1) 描述 获取 PLC 的数据。数据是存储在 read_data[start]~read_data[start+data_count-1] 这些一维数组变量中。 data_count 是设定的读取数据的个数。一般来说,read_data 是一个一维数组, 但是如果 data_count 是 1,read_data 可以是一个一维数组,也可以是一个普通 的变量。下面是两种从 PLC 中读取一个字的方法。macro_command main() short read_data_1[2], read_data_2 GetData(read_data_1[0], “FATEK FB Series”, RT, 5, 1) GetData(read_data_2, end macro_command “FATEK FB Series”, RT, 5, 1)此处的 device_函数名称,即为在“系统参数”中建立“PLC 类型”时,设定 的“PLC 名称”。在此,PLC 名称被设定为“FATEK FB Series,如下图所示。device_type 是设备类型和 PLC 中数据的编码方式。例如:如果 device_type 是44 LW_BIN,那么读取的设备类型为 LW,数据编码方式为 BIN。如果使用 BIN 编码方式,“_BIN”可以忽略。 如果 device_type 是 LW_BCD,表示设备类型 LW,数据的编码方式为 BCD 格 式。 address_offset 是 PLC 中的地址偏移量。 例如, GetData(read_data_1[0], “FATEK FB Series”, RT, 5, 1) 代表读取的设备 地址偏移量为 5。 如果 address_offset 使用格式为“N#AAAAA”,N 表示 PLC 的站号,AAAAA 表示地址偏移量。此情况一般使用在同一个串口上连接有多台 PLC 或者控制 器的情况下。例如:GetData(read_data_1[0], “FATEK FB Series”, RT, 2#5, 1)表 示读取站号为 2 的 PLC 的数据。如果 GetData()使用“系统参数/设备列表”中 设定的默认的站号,在此可以不填这个站号。从 PLC 中读取的数据个数, 根据 read_data 变量的类型和 data_count 的值来决 定的。如下表所示:read_data 的类型 char (8-bit)data_count 的值读取 16 位数据的个数 1145 char (8-bit) bool (8-bit) bool (8-bit) short (16-bit) short (16-bit) int (32-bit) int (32-bit) float (32-bit) float (32-bit)2 1 2 1 2 1 2 1 21 1 1 1 2 2 4 2 4当 Getdata()函数读取 32 位的数据类型(int 或者 float 型)时, 此函数会自动的转 换这个数据。例如:macro_command main() float f GetData(f, &MODBUS&, 6x, 2, 1) // f 中将会是浮点型的数据 end macro_command 举例 macro_command main() bool a bool b[30] short c short d[50] int e int f[10] double g[10]46 //读取 LB2 的状态到变量 a 中GetData(a, “Local HMI”, LB, 2, 1)// 读取 LB0~LB29 共 30 个状态,到变量 b[0]~b[29]中 GetData(b[0], “Local HMI”, LB, 0, 30)// 读取 LW2 的数据到变量 c 中 GetData(c, “Local HMI”, LW, 2, 1)//读取 LW0~LW49 共 50 个字到变量 d[0]到 d[49]中GetData(d[0], “Local HMI”, LW, 0, 50)// //读取两个字 LW6~LW7 到变量 e 中 注意此时变量 e 的类型为 intGetData(e, “Local HMI”, LW, 6, 1)//读取 LW0~LW19 共 20 个字到变量 f[0]~f[9]中, 数组 f[10]的变量类型定义为 int。 GetData(f[0], “Local HMI”, LW, 0, 10)//读取 LW2~LW3 共 2 个字到变量 f 中GetData(f, “Local HMI”, LW, 2, 1)end macro_command47 函数名称 语法SetData SetData(send_data[start], device_函数名称, device_type, address_offset, data_count) or SetData(send_data, device_函数名称, device_type, address_offset, 1)描述将数据写到 PLC 中。数据保存在 send_data[start]~send_data[start+data_count-1] 中。 data_count 是写入到 PLC 中数据的个数。一般来说,send_data 是一个数组。但 是如果 data_count 是 1,send_data 可以是一个数组也可以是一个普通的变量。 下面是写一个数据到 PLC 中的方法。macro_command main() short send_data_1[2] = { 5, 6}, send_data_2 = 5 SetData(send_data_1[0], “FATEK FB Series”, RT, 5, 1) SetData(send_data_2, end macro_command “FATEK FB Series”, RT, 5, 1)device_函数名称详见上面的说明,在此不在说明。 device_type 是设备类型和 PLC 中数据的编码方式。例如:如果 device_type 是 LW_BIN,那么读取的设备类型为 LW,数据编码方式为 BIN。如果使用 BIN 编码方式,“_BIN”可以忽略。 如果 device_type 是 LW_BCD,表示设备类型 LW,数据的编码方式为 BCD 格 式。48 address_offset 是 PLC 中的地址偏移量。 例如, GetData(read_data_1[0], “FATEK FB Series”, RT, 5, 1) 代表读取的设备 地址偏移量为 5。 如果 address_offset 使用格式为“N#AAAAA”,N 表示 PLC 的站号,AAAAA 表示地址偏移量。 此情况一般使用在同一个串口上连接有多台 PLC 或者控制器 的情况下。例如:SetData(send_data_1[0], “FATEK FB Series”, RT, 2#5, 1)表示 设定站号为 2 的 PLC 的数据。如果 SetData()使用“系统参数/设备列表”中设 定的默认的站号,在此可以不填这个站号。设定到 PLC 的数据个数, 根据 sead_data 变量的类型和 data_count 的值来决定 的。如下表所示:sead_data 的类型 char (8-bit) char (8-bit) bool (8-bit) bool (8-bit) short (16-bit) short (16-bit) int (32-bit) int (32-bit) float (32-bit) float (32-bit)data_count 的值设定 16 位数据的个数 1 1 1 1 1 2 2 4 2 41 2 1 2 1 2 1 2 1 249 当 Setdata()函数写入 32 位的数据类型(int 或者 float 型)到 PLC 时, 此函数会自 动的转换这个数据。例如:macro_command main() float f = 2.6 SetData(f, &MODBUS&, 6x, 2, 1) //在此将会设定一个浮点数到 PLC 中 end macro_command 举例 macro_command main() int i bool a = true bool b[30] short c = false short d[50] int e = 5 int f[10]for i = 0 to 29 b[i] = true next ifor i = 0 to 49 d[i] = i * 2 next ifor i = 0 to 950 f [i] = i * 3 next i//将变量 a 的数值设定到 LB2 中SetData(a, “Local HMI”, LB, 2, 1)//设定 LB0~LB29 共 30 个位的状态SetData(b[0], “Local HMI”, LB, 0, 30)//将变量 c 的值设定到 LW2 中SetData(c, “Local HMI”, LW, 2, 1)//设定 LW0~LW49 共 50 个数据SetData(d[0], “Local HMI”, LW, 0, 50)// 将变量 e 的值写入到 LW6 ~LW7 两个寄存器中,注意变量 e 的类型为 int。 SetData(e, “Local HMI”, LW, 6, 1)// //设定 LW0~LW19 共 20 个字的数据 10 个双整型数据等于 20 个 16 位整型数。SetData(f[0], “Local HMI”, LW, 0, 10)end macro_command51 30.6 怎样建立和执行宏指令 30.6.1 怎样建立一个宏指令按照以下步骤可以建议一个宏指令。步骤一: 单击 EB8000 软件工具栏上的宏指令图标 打开宏指令管理对话框。如下图所示。52 在宏指令管理对话框中,已经编译成功的宏指令会出现在“已编译成功”列表上,未完成编 译的会出现在“未完成编译”列表中。下面是宏指令管理对话框中各按键的功能描述。[新增] 新增一个宏指令,并打开新建的宏指令编辑区。 [删除] 删除选中的宏指令 [编辑] 打开宏指令编辑区,并打开选中的宏指令。 [复制] 复制选中的宏指令。 [粘贴] 将刚刚选中的需要复制的宏指令,添加到“已编译完成”列表区,并产生一个新的宏指 令名称。步骤二: 按下“新增”按钮,打开一个新增的宏指令编辑区。每一个宏指令都有一个唯一的编号,定 义在“编号”这个位置。在“宏指令名称”这个栏目中也必须输入宏指令的名称,否则编译 将无法通过。53 步骤三: 设计你的宏指令程序。如果有必要的话,使用内建的函数,譬如 Setdata()或者 Getdata 等函 数。单击“函数…”按键打开一个函数列表对话框,选择需要的函数,并设定必要的参数。54 步骤四: 编辑完成一个新建的宏指令程序后,单击“编译”按键,对该宏指令进行编辑工作。55 如果没有错误,单击“关闭”按键,这样在“已编译成功”区会发现新增了一个“macro_test” 这个名称的宏指令。56 30.6.2 执行宏指令执行宏指令有多种不同的方法,下面分别说明。a. 使用“PLC 控制”元件 1. 打开 PLC 控制元件,并设定属性为“执行宏指令”;57 2. 选择需要执行的宏指令名称。 选择一个位作为触发宏指令并设定触发宏指令的条件。 在条件满足时,该宏指令将会被重复执行。为了每次只让宏指令执行一次,设计时 需在宏指令将该触发位复位。 3. 使用一个“位状态设置”元件或者“位状态切换开关”元件作为这个位的控制开关。b. 使用“位状态设置”元件或者“位状态切换开关”元件 1. 在“位状态设置”元件或者“位状态切换开关”元件的一般属性页中,勾选“使用 宏指令”; 2. 选择要执行的宏指令。这样这个元件被执行时,选择的宏指令就会被执行一次。c. 使用功能键 1. 在功能键的一般属性页对话框中,勾选“触发宏指令”; 2. 选择需要执行的宏指令。这样,每按一下这个功能键时,选中的宏指令就会被执行 一次。30.7 使用宏指令时的注意事项1. 存储局部变量的空间是 4KB,所以各种不同变量类型的最大数组大小为如下:char a[4096] bool b[4096] short c[2048] int d[1024] float e[1024]58 2. 一个 EasyBuider8000 工程中最多包含 256 个宏指令。 3. 宏指令有可能造成 HMI 当机,可能的原因为: .宏指令中执行了一个死循环命令 .数组的大小超过了宏指令的变量容量4. 使用过多的宏指令,可能会造成与 PLC 的通讯速度变慢30.8 使用自由协议去控制一个设备当 EasyBuiler8000 还没有一个建立好的驱动程序与某一个设备通讯时,使用者也可以使用宏 指令中的 OUTPORT 和 INPORT 函数来实现与该设备的通讯。使用 OUTPORT 和 INPORT 函数发送和接收的数据,必须遵行该设备的通讯协议。下面的范例程序说明了如果使用这两 个函数来控制一个 MODBUS RTU 设备。 首先,在系统参数/设备列表中建立一个新的设备。这个新建的“PLC 类型”设置为“Free Protocol”,“PLC 名称”设置为“MODBUS RTU Device”,如下图所示。59 这里的设备连接使用 RS232 口, 如果连接一个 MODBUS TCP/IP 设备, 这个接口类型必须设 定为“以太网”,同时必须设定正确的 IP 地址和端口号,如下图所示。60 假设 MT8000 人机界面将要读取设备中的 4x_1 和 4x_2 两个数据寄存器。首先,使用 OUTPORT 函数发送读命令给这个设备,OUTPORT 函数的写法为: OUTPORT(command[start], device_函数名称, cmd_count)因为 “MODBUS RTU Device” 是一个 MODBUS RTU 设备, 读数据的命令必须遵行 MODBUS RTU 协议的命令规则。故,必须使用 0x03 这个命令去读取 4x_1 和 4x_2 这两个数据寄存器 的数据。下图说明了读命令的格式。(省略了设备的站号和最后的两个 CRC 字节)根据这个 MODBUS RTU 协议,发送命令的内容如下所示:(总共 8 个字节)command[0] : station number command[1] : function code command[2] : high byte of starting address command[3] : low byte of starting address command[4] : high byte of quantity of registers command[5] : low byte of quantity of registers command[6] : low byte of 16-bit CRC command[7] : high byte of 16-bit CRC(BYTE 0)站号 (BYTE 1)功能码 (BYTE 2)起始地址高位 (BYTE 3)起始地址低位 (BYTE 4)数据寄存器的高位 (BYTE 5)数据寄存器的低位 (BYTE 6)CRC的低字节 (BYTE 7)CRC的高字节所以读数据的命令宏指令程序设计如下:61 char command[32] short address, checksumFILL(command[0], 0, 32) // initialize command[0]~command[31] to 0command[0] = 0x1 // station number command[1] = 0x3 // read holding registers (function code is 0x3)address = 0//starting address (4x_1) is 0HIBYTE(address, command[2]) LOBYTE(address, command[3])read_no = 2// the total words of reading is 2 words HIBYTE(read_no, command[4]) LOBYTE(read_no, command[5])CRC(command[0], checksum, 6)//calculate 16-bit CRCLOBYTE(checksum, command[6]) HIBYTE(checksum, command[7])最后,使用OUTPORT函数将这个读命令发送给这个MODBUS RTU设备。OUTPORT(command[0], &MODBUS RTU Device&, 8)// 发送读命令62 发送完这个命令后, 使用INPORT函数读取该MODBUS RTU设备返回的命令。 根据MODBUS RTU协议,这个回复的命令内容为如下(总共9个字节):command[0] : station number command[1] : function code command[2] : byte count command[3] : high byte of 4x_1 command[4] : low byte of 4x_1 command[5] : high byte of 4x_2 command[6] : high byte of 4x_2 command[7] : low byte of 16-bit CRC command[8] : high byte of 16-bit CRC(BYTE 0)站号 (BYTE 1)功能码 (BYTE 2)字节长度 (BYTE 3)第一个数据的高字节 (BYTE 4)第一个数据的低字节 (BYTE 5)第二个数据的高字节 (BYTE 6)第二个数据的低字节 (BYTE 7)CRC的低字节 (BYTE 8)CRC的高字节此时,INPORT函数的语句如下:INPORT(response[0], &MODBUS RTU Device&, 9, return_value)// 读取回复的命令在这里,读取的真正返回的字节长度存放在变量return_value(变量类型为字节)中。如果 return_value的数据为0,则表示使用INPORT读取命令失败。根据MODBUS RTU协议,如果命令回复的正确,则response[1]必须为0x03。当读取到正确的 命令后,计算出4x_1和4x_2这两个寄存器的值,并将这两个数据送到人机界面的LW100和 LW101寄存器中。 if (return_value &0 and response[1] == 0x3) then read_data[0] = response[4] + (response[3] && 8)// 计算4x_1的数据 read_data[1] = response[6] + (response[5] && 8)// 计算4x_2的数据63 SetData(read_data[0], &Local HMI&, LW, 100, 2) end if//计算后的数据送到HMI上来显示完整的宏指令程序如下: // Read Holding Registersmacro_command main()char command[32], response[32] short address, checksum short read_no, return_value, read_data[2], iFILL(command[0], 0, 32)// initialize command[0]~command[31] to 0 FILL(response[0], 0, 32)command[0] = 0x1//station numbercommand[1] = 0x3// read holding registers (function code is 0x3)address = 0 address = 0// starting address (4x_1) is 0HIBYTE(address, command[2]) LOBYTE(address, command[3])read_no = 2/the total words of reading is 2 wordsHIBYTE(read_no, command[4]) LOBYTE(read_no, command[5])64 CRC(command[0], checksum, 6)//calculate 16-bit CRCLOBYTE(checksum, command[6]) HIBYTE(checksum, command[7])OUTPORT(command[0], &MODBUS RTU Device&, 8 )// send request INPORT(response[0], &MODBUS RTU Device&, 9, return_value)// read responseif (return_value & 0 and response[1] == 0x3) then read_data[0] = response[4] + (response[3] && 8)// read_data[1] = response[6] + (response[5] && 8)// 4x_1 4x_2SetData(read_data[0], &Local HMI&, LW, 100, 2) end ifend macro_command下面的举例说明如何使用自由协议设定 MODBUS RTU 设备中 0x_1 的状态。这个是使用 MODBUS RTU 协议中的“写单个寄存器”的功能码“0x05”来实现的。65 完整的宏指令程序如下: // Write Single Coil (ON)macro_command main()char command[32], response[32] short address, checksum short i, return_valueFILL(command[0], 0, 32)// initialize command[0]~ command[31] to 0 FILL(response[0], 0, 32)command[0] = 0x1// command[1] = 0x5//station number function code : write single coiladdress = 0 HIBYTE(address, command[2]) LOBYTE(address, command[3])66 command[4] = 0xff// command[5] = 0force 0x_1 onCRC(command[0], checksum, 6)LOBYTE(checksum, command[6]) HIBYTE(checksum, command[7])OUTPORT(command[0], &MODBUS RTU Device&, 8)//send requestINPORT(response[0], &MODBUS RTU Device&, 8, return_value)// read responseend macro_command30.9 编译错误提示信息1. 错误信息格式:error c# : error 描述 (# 是错误信息编号)举例: error C37 : undeclared identifier : i67 当编译后提示有错误信息时,这个错误的描述内容可以参考错误信息编号。2. Error 描述(C1) 语法 error:“标识符” 出现这个信息时,有许多种可能;举例: macro_command main() char i, 123xyz // 不支持这个变量类型end macro_command(C2) ‘identifier’ used without having been initialized(使用的标识符没有初始化) 宏指令必须定义声明的数组变量的大小For 举例: macro_command main() char i int g[i] // i 必须为一个数值常量 end macro_command(C3) redefinition error : ‘identifier’ (标识符被重复定义)函数名称和变量名称在有效范围内,必须是唯一的。For 举例:68 macro_command main() int g[10],g // 重复定义错误end macro_command(C4) function 函数名称 error : ‘identifier’ (函数名称定义错误) 保留的关键字和常量,不能被定义为函数名称For 举例: sub int if() // 函数名称定义错误(C5) parentheses have not come in pairs(圆括号没有成对的出现) 语句中丢失了 “(“ 或者 “)”举例: macro_command main ) // 少了 “(“(C6) illegal expression without matching ‘if’(if 语句中没有合法的表达式) 也就是在 if 语句中缺少表达式(C7) illegal expression (no ‘then’) without matching ‘if’(if 语句中丢失了 then) 也就是 if 和 then 没有匹配上(C8) illegal expression (no ‘end if’)(if 语句中缺少了 enf if) 缺少了 “end if”(C9) illegal ‘end if’ without matching ‘if’(end if 语句前缺少了 if 与其匹配)69 End if 语句前缺少了 if 语句(C10) illegal ‘else’ (不合法的 else 语句) 这个“if”语句的格式为: if [逻辑表达式] then[ else [if [逻辑表达式] then ] ]end if 任何与以上格式不符合的语句,在编译时就会报错。(C17) illegal expression (no 'for') without matching ‘next’(没有与 next 相匹配的 for 语句)“for”语句错误:在“next”前,缺少了“for”语句(C18) illegal variable type (not integer or char)(不合法的变量类型)变量类型定义错误,此处应为整数型态或字符型态变量?(C19) variable type error 缺少赋值语句(C20) must be keyword ‘to’ or ‘down’(缺少了关键词“to”或者“down”) 缺少了关键词 “to” 或者 “down”(C21) illegal expression (no 'next')(非法的表达式,缺少了“next”)70 “for”语句的格式为: for [变量] = [初始值] to [结束值] [step]next [变量] 任何与上述格式不符合的语句,编译时都会报错。(C22) ‘wend’ statement contains no ‘while’ ‘while’循环不配对,’wend’前面应有’while’关键词(C23) illegal expression without matching ‘wend’ 缺少“wend”关键词 “while”语句的格式为:while [逻辑表达式]wend任何不符合上述语法的,在编译时均会报错。(C24) 语法 error : ‘break’不合法的‘break’语句。break 语句只能在 for 循环、while 循环选择结构中使用, 且 break 单独成一行。(C25) 语法 error : ‘continue’71 不合法的“continue”语句。Continue 语句只会在“for”或者“while”语句中出现。(C26) 语法 error 表达式不正确(C27) 语法 error 表达式中缺少了一个运算符可能会造成这个编译错误信息。For 举例 : macro_command main( ) int a, b for a = 0 to 2 b = 4 + xyz // 不合法之处: xyz 变量没有被定义 next a end macro_command(C28) must be ‘macro_command’ 此处应该为 ’macro_command’(C29) must be key word ‘sub’子函数的定义格式为:sub [data type] function_函数名称(…) ……….. end sub72 For 举例:: sub int pow(int exp) ……. end sub任何不符合上述语法结构的,在编译时均会报错。(C30) number of parameters is incorrect 参数个数不对。(C31) parameter type is incorrect 参数数据类型不匹配。调用函数时,参数必须在数据类型、个数上一一对应才能通过编 译,否则编译时将出现此项错误讯息。?(C32) variable is incorrect变量类型不正确(C33) function 函数名称 : undeclared function没有定义的函数名称(C34) expected constant expression不合法的数组下标表达形式73 (C35) invalid array declaration不合法的数组定义(C36) array index error不合法的数组下标(C37) undeclared identifier : i ‘identifier’使用没有定义的变量。只能使用已经定义的变量和函数,否则编译时将出现此项错误 讯息。?(C38) un-supported PLC data address通讯函数 GetData(?…?)、SetData(?…?)的参数中有包含 PLC 地址类型信息,当 PLC 地址类 型不是此种 PLC 支持的地址类型时,编译时将出现此项错误讯息。?(C39) ‘idenifier’ must be integer, char or constant 数组的格式为: 声明: array_函数名称[constant] (constant is the size of the array) 使用: array_函数名称[integer, character or constant] 任何不符合上述规则的数组表达式,编译时将会报错(C40) execution 语法 should not exist before variable declaration or constant definition74 变量定义语句的前面不能有执行语句?For 举例 : macro_command main( int a, b for a = 0 To 2 b=4+a int h , k // 定义变量语句在此处是错误的,? 在一个函数内定义变量语句的前面不能有? ? ? ? ? ? ? ? ? //? 执行语句,例如? b?=?4?+?a? ? )next a end macro_command(C41) float variables cannot be contained in shift calculation 移位运算中,操作数不能为浮点数。?(C42) function must return a value 函数应有返回值?(C43) function should not return a value 函数不应有返回值?(C44) float variables cannot be contained in calculation 运算中不能有 float 型资料?75 (C45) PLC address error PLC 地址错误?(C46) array size overflow (max. 4k) 一维数组的大小超过 4k?(C47) macro command entry function is not only one 宏指令程序入口只能有一个?(C48) macro command entry function must be only one 宏指令入口函数不唯一。宏指令的入口函数只能有一个,形式为:? macro_command function_函数名称( ) end macro_command(C49) an extended addressee’s station number must be between 0 and 255 在宏指令中,扩展地址内的站号大小只能从 0 到 255?For 举例 : SetData(bits[0] , “PLC 1”, LB , 300#123, 100) // illegal : 300#123 意思是站号为 300, 但是最大值是 255(C50) an invalid PLC 函数名称 在宏指令中,PLC 的名称并未定义在系统参数的设备列表中?(C51) macro command do not control a remote device 宏指令只能控制本机连接的设备?76 For 举例 :SetData(bits[0] , “PLC 1”, LB , 300#123, 100)“PLC1”连接在远端的 HMI 上,故它不能被执行。77 30.10 宏指令范例程序1. for 循环,各种表达式(算术,移位元,逻辑,关系表达式)?macro_command main() int a[10], b[10], ib[0]= (400 + 400 && 2) / 401 b[1]= 22 *2 - 30 % 7 b[2]= 111 && 2 b[3]= 403 & 9 + 3 &= 9 + 3 & 4 + 3 &= 8 + 8 == 8 b[4]= not 8 + 1 and 2 + 1 or 0 + 1 xor 2 b[5]= 405 and 3 and not 0 b[6]= 8 & 4 + 4 & 4 + 8 | 4 + 8 ^ 4 b[7]= 6 C (~4) b[8]= 0x11 b[9]= 409for i = 0 to 4 step 1 if (a[0] == 400) then GetData(a[0],”Device 1”, 4x, 0,9) GetData(b[0],”Device 1”, 4x, 11,10) end If next i end macro_command78 2. while,?if,?break 语句?macro_command main() int b[10], i i=5 while i == 5 - 20 % 3 GetData(b[1], ”Device 1”, 4x, 11, 1)if b[1] == 100 then break end if wend end macro_command3. 全局变量和子函数调用?char g sub int fun(int j, int k) int ySetData(j, “Local HMI”, LB, 14, 1) GetData(y, “Local HMI”, LB, 15, 1) g=yreturn y79 end Submacro_command main() int a, b, ia=2 b=3 i = fun(a, b) SetData(i, “Local HMI”, LB, 16, 1) end macro_command4. if 结构语句?macro_command main() int k[10], jfor j = 0 to 10 k[j] = j next jif k[0] == 0 then SetData(k[1], “Device 1”, 4x, 0, 1) end ifif k[0] == 0 then SetData(k[1], “Device 1”, 4x, 0, 1)80 else SetData(k[2], “Device 1”, 4x, 0, 1) end ifif k[0] == 0 then SetData(k[1], “Device 1”, 4x, 1, 1) else if k[2] == 1 then SetData(k[3], “Device 1”, 4x, 2, 1) end Ifif k[0] == 0 then SetData(k[1], “Device 1”, 4x, 3, 1) else if k[2] == 2 then SetData(k[3], “Device 1”, 4x, 4, 1) else SetData(k[4], “Device 1”, 4x, 5, 1) end If end macro_command5. while 和 wend 结构语句?macro_command main() char i = 0 int a[13], b[14], c = 4848b[0] = 1381 while b[0] a[i] = 20 + i * 10if a[i] == 120 then c =200 break end ifi=i+1 wendSetData(c, “Device 1”, 4x, 2, 1) end macro_command6. break 和 continue 语句结构?macro_command main() char i = 0 int a[13], b[14], c = 4848b[0] = 13while b[0] a[i] = 20 + i * 1082 if a[i] == 120 then c =200 i=i+1 continue end ifi=i+1if c == 200 then SetData(c, “Device 1”, 4x, 2, 1) break end if wend end macro_command7. 数组结构?macro_command main() int a[25], b[25], ib[0] = 13for i = 0 to b[0] step 1 a[i] = 20 + i * 10 next i83 SetData(a[0], “Device 1”, 4x, 0, 13) end macro_command84
更多搜索:
赞助商链接
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 威纶通触摸屏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信