Plant Simulation 进阶学习记录(一)–常用语法函数
本文梳理了一些常见的语法函数,包括其含义、一些特殊的用法、示例代码等,方便使用时查找。感谢B站白木杉UP主Plant simulation(进阶篇),进阶篇案例讲的很好,后续也会更新(传送带、AGV、免费库等进阶篇内容的学习记录)
tip:文中如果有错误会检查修改~~
常用字符串处理函数
关键词/函数名称 | 含义/示例代码 |
---|---|
sprint(i,j,k) | 返回ijk从左到右相拼接结果(字符串相加),返回值类型为string |
strlen(Text:string) → integer | 输出字符串长度。例如:strlen(“abcd”),返回值为 4 |
strcopy(SourceText:string, NumberOfCharacters:integer) → string | 将字符串从右边往左开始复制指定位数的字符。 例如strcopy(“zhishenkeji”,4),返回值为”keji” |
strRpos(TextToBeFound:string, SourceText:string) → integer | 输出指定字符在字符串中的位置,有多个相同字符时,从左向右输出最后一个相同字符的位置。例如:strrpos(“I”,“zhishenkeji”),返回值为11 |
omit(SourceText:string, Position:integer, NumberOfCharacters:integer) → string | 该函数省略复制一个字符串并从中删除一系列字符。例如:print omit(“abcdef”,3,2) ,返回值为 “abef” |
incl(TextToBeInserted:string, Text:string, Position:integer) → string | 将字符串A插入到字符串B的指定位置。例如:incl(“.tech”,“zhishenkeji”,12),返回值为"zhishenkeji.tech" |
copy(String:string, Position:integer, NumberOfCharacters:integer) | 按指定位置和长度,从目标字符串复制部分字符。如:copy(“zhishenkeji.tech”,13,4),返回值为" tech"(omit功能更强) |
常用表格处理函数
特殊表格
StackFile.push(<value>)
:表中第一格插入数据(字符串要用 “”)QueneFile.push(<value>)
:表中最后一格插入数据StackFile.pop
或者QueneFile.pop
:读取表中第一格内容并删除它CardFile.read (3)
:读取表中第三行内容,但不删除它CardFile.insert(5,<value>)
:写表,将值插入表中第五行单元格,原来第五行单元格内容及以下的单元格内容都往下自动移一格(不覆盖)StackFile.dim
或QueneFile.dim
或CardFile.dim
:返回最后有内容的行号
一般表格
tablefile.dim=tablefile.Xdim*tablefile.Ydim
:tablefile.Xdim
为去除 0 列的列数,tablefile.Ydim
为去除 0 行 (索引行) 的行数tablefile.indexydim
:返回开了列索引的最后有内容的行号,如果没内容则返回 0
通用表格
<Path>.find ({"MU", 1}..{"MU",*},< 所找寻的值 >)
:在指定范围内寻找值,找到了返回 true,没找到返回 false<Path>.setCursor (Column:any, Row:any) → boolean
:设置光标在指定位置,与 find 搭配使用时,find 从光标处开始寻找,并将光标设置为下一个找到的项目<Path>.CursorY
:返回目前光标所在的行号<Path>.CursorX
:返回光标所在的列号<Path>.cutrow (1)
:删除第一行(可与循环搭配)<Path>.copyContentTo (DestinationTable:list)
:将 path 路径的表格内容复制给目的表格,列索引不复制。<Path>.meanValue ({1,1}..{1,*})
:返回范围内所有实数型和整型的数据的算术平均值<Path>.writeRow (Column:any, Row:any, Value:any [, Value:any, …, Value:any])
:将 Value 的值按顺序写入表中的一行,参数至少为三个,其中 Column 表示开始写入的列数,Row 表示在第几行写入,Value 填入对应列类型的值。(一般)<Path>.create
:创建表格。例如:var OrderList : table [string,real] ; OrderList.create; OrderList [1,1] := "Cans"
常用属性转换命令
关键词/函数名称 | 含义/示例代码 |
---|---|
to_str() | 其他类型转换成字符串 |
str_to_num() | 字符串转换成整型 |
num_to_str() | 整型转换成字符串 |
str_to_obj() | 字符串转换成已存在对象的绝对路径 |
obj_to_str() | 对象转换成字符串(绝对路径显示) |
num_to_bool(1) | 1 转换成 true |
bool_to_num(true) | true 转换成 1 |
常用数学函数
关键词/函数名称 | 含义/示例代码 |
---|---|
pow(x, y) | 计算 x 的 y 次幂 |
sqrt(x) | 计算 x 的平方根 |
ceil(x) | 将小数 x 向上取整 |
floor(x) | 将小数 x 向下取整 |
max(x, y) | 返回 x 和 y 中的最大值 |
round(x) | 将 x 四舍五入到个位 |
round (x, y) | 将 x 四舍五入到 y 位小数 |
div | 计算整除的商 |
mod | 计算整除后的余数 |
常用对象相关语法函数
&
:引用操作符,只有对全局变量和方法指定的时候使用,代表只引用其本身,而不引用其值existsObject (NameOfObject:string) → boolean
:判断是否有对象为该名字,如有则返回 true(比._3D.Exists
好用)<Path>.deleteObject → boolean
:删除 Path 的所有对象,path 为相对路径时删除框架中的实例,为绝对路径时删除类库中的类和衍生的实例<类库中类的绝对路径>.createObject (Destination:object,Xpos:integer,Ypos:integer, Name:string)→ object
:创建对象,Destination 为创建后框架的路径,Xpos、Ypos 为位置,Name 为对象名<类库中类的绝对路径>.derive ([Destination:object, Name:string]) → object
:用于派生对象,Destination 为派生后框架的路径,Name 为对象名
示例:.信息流.&方法.derive (current,"My_method")
—— 在当前模型中派生创建名字为 My_method 的方法(可用duplicate
复制代替derive
)<Path>.createAttr (AttributeName:string, DataType:string) → boolean
:创建自定义属性<Path>.createSensor (Position:real, PositionType:string, Control:method [, Front:boolean, Rear:boolean [,Destination:Path [, BothLanes:boolean [, LightBarrierMode:boolean]]] → integer])
:创建传感器,位置类型可为 “Length” 或 “Relative”
示例:
MyConveyor.createSensor (0.5,"Length","MyControl",true,false,VOID,false,false)
MyTrack.createSensor (0.7,"Relative",&myMethod,false,true)
<Path>.deleteSensor (SensorID:integer) → boolean
:删除传感器<框架名>.deletemovables
:删除框架中的所有 MU
@.deletemovables—— 删除 MU(@)上的所有零件
访问容量大于1的函数方法
- ①
<Path>.pe(X:integer, Y:integer) → object
- ②
<Path>[X:integer, Y:integer] → boolean
情景一:对有容量的 MU(小车,容器)
print.MUs.Transporter:1 [3,2].Cont --打印小车位置 [3,2] 上的内容
@.pe (3,2).Cont.move (machine) --传感器处小车第二行第三列的内容移动至机器上(注意中括号和小括号的区别)
情景二:对存储和并行工位
@.move (MyStore.pe (2,3)) -- @代表的 MU 移动到存储的第三行第二列的位置处
MyStore [2,3].Cont.move (Station) --存储的第三行第二列上的内容移动到工站上
情景三:对 (放置) 缓冲区
-
@.move (MyPlaceBuffer [2])
等价于@.move (MyPlaceBuffer.pe (2))
-
③
<Path>.mu (Index:integer) → object
-
④
<Path>.muPart(Index:integer)
情景四:对传送带 —— 返回路径对象上的 MU 对象,Index 为进入的顺序,最先进入(即第一个单元格或者传送带上最末端)的标号为 1,以此类推。
例如让机械臂从容器的最后一格开始抓取:
for var j := @.numMU downto 1
var mu : object := @.mu (j)
-- 容器上的最后一格
mu.move (机械臂)
next
其他
messageBox (Text:string, Buttons:real, Icons:real) → integer
代码运行到此弹出消息框,按下不同按钮会返回不同的整型值,可根据返回值执行对应的操作。
(Buttons 是显示的按钮返回值之和,返回值汇总:确定 1,取消 2,忽略 4,继续 4,重试 8,是 16,否 32,终止 64。) (Icons 是显示不同图标:无 0,错误 1,问题 2,警告 3,消息 4)
switch messageBox ("My message text: 请输入操作",50, 4)
case 16 -- 是
print "Yes" -- 这里可用来执行自定义操作
case 32 -- 否
print "No"
else -- 取消
print "Cancel"
end
prompt (Text:string [,MoreText:string, …]) → string
弹出一个输入框,用户输入字符串数据。
例如可在 init 方法中写入:
轨道.capacity:=str_to_num (prompt ("轨道的容量是 (请输入 1-5):") )
for var i:=1 to 轨道.capacity
.MU. 小车.create (轨道,轨道.length-i*4)
轨道.mu (i).speed:=str_to_speed ( prompt ("第 i 辆小车的速度是:") )
next
execute
execute (SourceCode:string [,Parameter:parameter, …])
函数 execute 接收一个字符串,并将其解释为方法的源代码。SourceCode 为源代码,Parameter 为传递的参数值。
例 1:
var objPath : string := "Track"
var attrName: string := "Length"
var attrVal : length:= 20
execute (to_str (objPath, ".", attrName, ":=", attrVal))
上面的代码等同于:Track.Length:=20
例 2:
execute ("param x, y: integer; print x+y", 1, 2)
(源代码多条语句间用分号隔开,传递参数值为 1 和 2,故输出值为 3)
&Method.execute ([Argument1:any, … [,@:object=@, ?:object=self]])
调用指定路径的方法并可传递参数值 (其中 @,?为系统内置)。
例 1:
var Varobj :any:= &MyMethod1
varobj.execute
例 2:
&MyMethod2.execute("abc",2)
例 3:
&MyMethod2.execute("abc",2,self.~,~)
&MyMethod.executeIn (CallAt:time [,Argument1:any, …]) → boolean
在方法(?)中指定时间秒速过后调用另一个方法(&MyMethod),调用时可传递多个参数值。老版本的语法函数叫做 methcall。
小技巧:
self.executein (1) -- 使该方法一直重复自我调用,调用间隔为 1 秒。等同于 self.methcall (1)
CallEvery (Frame:path, Method:string [, Parameters:parameters])
CallEvery 调用在指定框架以及子框架中具有指定名称的所有方法,可传递参数。
一般对象控件的触发方式
- 构造器:复制、派生或实例化对象(插入到框架中)时
- 解构器:删除对象时
- 连接:用连接器连接对象时
- 打开:打开对象时(可选择无控件打开)
- 关闭:关闭对象时
- 真实性:在对象对话框中点击应用或确定时
- 选择:鼠标左键选中对象时
- 拖放:将其他对象拖到创建拖放控件的对象上时
- 允许删除:试图删除为其编程控件的对象时
- 移入框架:在框架中拖动对象位置时
- 重命名:为对象重新命名时
- 重标:为对象修改标签时
- 失败:对象发生故障时
- 暂停:对象暂停工作时
- 更改路径、移至文件夹:在类库中进行相应操作时
- 初始化:当前框架的事件控制器初始化仿真(init)时