昆仑通态MCGSpro,自定义配方功能
最近在做一个机床的控制系统,是用来打磨轴承滚子的,用到了昆仑通态触摸屏,西门子1200,以及1个台达变频器,五个私服电机。大致就是下面这个设备。
对于西门子1200运动控制的相关内容,以及调试过程中遇到的坑,改天再写一个文章。这里重点介绍配置文件的功能。
控制界面上需要做一个工件加工参数读写功能,见下图。实际上就是配方功能。奈何mcgspro自带的配方功能,界面实在是太丑了。于是想自己做一个。
既然自己做一个,就完全脱离软件自带的配方功能。自带的配方功能,应该是数据库保存的。找了半天,没有发现软件有提供数据库操作的函数接口。也就是说,没法像软件自带的配方那样,弄到数据库里面。既然使用数据库不行,那就直接写到文件。
按照每行一个配方,第一列是配方名称,后面是配方值,逗号隔开,也就是csv文件格式。见下图。---表示没有配方。
首先是配方初始化,在软件启动的时候,对配方进行初始化,见下面代码。大致原理就是如果配置文件不存在,就创建一个。注意FileAppend,不会创建文件。所以之前必须有FileWriteByStr.
dim i as INTEGER
dim r as INTEGER
dim str as STRING
r=!FileReadByStr("$MCGS_DIR_USER/qcfg.csv",0,-1,str,TEXT_UTF8) '尝试去读配置文件
if r<0 then '如果读取不到,就给文件初始化了。!FileWriteByStr("$MCGS_DIR_USER/qcfg.csv","---,",FILE_TRUNC,TEXT_UTF8) '强制创建新的文件i=2 '第一行写了,第二行开始WHILE i<=50 '循环写剩下的49行!FileAppend("$MCGS_DIR_USER/qcfg.csv","---,\n")I=i+1ENDWHILE
ENDIF
其次在,参数列表页面。需要创建50个用于显示参数名称的标签,以及创建50个用于显示参数名称的变量,变量都是字符串类型。
标签绑定显示变量:
在列表页面,启动脚本,添加代码,主要原理是读取配置文件。然后用SplitString,换行符,分割为一个字符串数组。每一行一个配置。
然后根据第一个逗号位置,给配置名称提取出来,名通过DataSetString给声明的名称变量赋值,以达到显示配置名称的功能。具体代码如下:
dim names(100) as STRING
dim str as STRING
DIM r as INTEGER
dim i as INTEGER
dim p as INTEGER
dim nm as STRING
dim vn as STRING
dim v as STRING
r=!FileReadByStr("$MCGS_DIR_USER/qcfg.csv",0,-1,str,TEXT_UTF8) '读取配置文件r=!SplitString(str,names,"\n") '按换行分割为字符串数组i=1
while i<=50 '循环所有配置p= !InStr(1, names[i],",") '查找第一个逗号位置nm=!left(names[i],p-1) '截取配置名称vn="NM"+!Format(i-1,"000") '拼接变量名称,!DataSetString(vn,nm ) '写入已经声明的变量i=i+1
ENDWHILE
有列表页面,还得加一个编辑页面,见下图。是一个弹出窗口。
辑页面的逻辑是,用户从列表页面点击,记录当前点击的项目下标到全局变量。然后打开编辑页面,编辑页面读取配置文件,按换行符进行分割,然后找到对应的下标,找到对应的行,进行逗号分割,按固定的顺序转换为变量值,显示到表格中。
从列表页面跳转到编辑页面的代码:
Index.Value=0'对应的配置下标存储一下
参数编辑.Open()'打开参数编辑页面
参数编辑.BringToTop()'置顶
下面是编辑页面,从文件找到对应的配置行,并转换为变量值的代码:
dim str as STRING
dim names(100) as STRING
dim ss as STRING
dim r as INTEGER
dim i as INTEGER
DIM val(60) as STRING
r=!FileReadByStr("$MCGS_DIR_USER/qcfg.csv",0,-1,str,TEXT_UTF8) '读取配置文件
if r < 0 then '如果没用读取到,就用默认值i=1WHILE i<=50names[i]=","i=i+1ENDWHILE
ELSEr=!SplitString(str,names,"\n")'对读取的配置文件进行分割
ENDIFss = names[index+1] '获取对应下标的行 r=!SplitString(ss,val,",") '分割配置行i=1 '下面全是字符串转换为对应的变量值T压轮转速A0.Value=!Val(val[i+1])T压轮转速A1.Value=!Val(val[i+2])T压轮转速A2.Value=!Val(val[i+3])T压轮转速A3.Value=!Val(val[i+4])T压轮转速A4.Value=!Val(val[i+5])
保存配置文件的逻辑,读取配置文件,分割成配置行。然后给当前页面的所有值,再按顺序拼接成字符串。然后循环写入配置,当前行的配置,使用新拼接的字符串。代码如下:
dim str as STRING
dim names(100) as STRING
dim ss as STRING
dim r as INTEGER
DIM I AS INTEGER
dim con as STRING
r=!FileReadByStr("$MCGS_DIR_USER/qcfg.csv",0,-1,str,TEXT_UTF8)
if r < 0 then '如果没有文件,就使用默认值i=1WHILE i<=50names[i]="---,"i=i+1ENDWHILE
ELSEr=!SplitString(str,names,"\n")ENDIFss=Name.Valuess=ss+","+!Str(T压轮转速A0.Value)ss=ss+","+!Str(T压轮转速A1.Value)ss=ss+","+!Str(T压轮转速A2.Value)ss=ss+","+!Str(T压轮转速A3.Value)ss=ss+","+!Str(T压轮转速A4.Value)ss=ss+","+!Str(T砂轮转速A0.Value)ss=ss+","+!Str(T砂轮转速A1.Value)ss=ss+","+!Str(T砂轮转速A2.Value)ss=ss+","+!Str(T砂轮转速A3.Value)ss=ss+","+!Str(T砂轮转速A4.Value)ss=ss+","+!Str(T震动速度A0.Value)ss=ss+","+!Str(T震动速度A1.Value)ss=ss+","+!Str(T震动速度A2.Value)ss=ss+","+!Str(T震动速度A3.Value)ss=ss+","+!Str(T震动速度A4.Value)ss=ss+","+!Str(T油石压力A0.Value)ss=ss+","+!Str(T油石压力A1.Value)ss=ss+","+!Str(T油石压力A2.Value)ss=ss+","+!Str(T油石压力A3.Value)ss=ss+","+!Str(T油石压力A4.Value)ss=ss+","+!Str(T加工时间A0.Value)ss=ss+","+!Str(T加工时间A1.Value)ss=ss+","+!Str(T加工时间A2.Value)ss=ss+","+!Str(T加工时间A3.Value)ss=ss+","+!Str(T加工时间A4.Value)ss=ss+","+!Str(T压轮转速B0.Value)ss=ss+","+!Str(T压轮转速B1.Value)ss=ss+","+!Str(T压轮转速B2.Value)ss=ss+","+!Str(T压轮转速B3.Value)ss=ss+","+!Str(T压轮转速B4.Value)ss=ss+","+!Str(T砂轮转速B0.Value)ss=ss+","+!Str(T砂轮转速B1.Value)ss=ss+","+!Str(T砂轮转速B2.Value)ss=ss+","+!Str(T砂轮转速B3.Value)ss=ss+","+!Str(T砂轮转速B4.Value)ss=ss+","+!Str(T震动速度B0.Value)ss=ss+","+!Str(T震动速度B1.Value)ss=ss+","+!Str(T震动速度B2.Value)ss=ss+","+!Str(T震动速度B3.Value)ss=ss+","+!Str(T震动速度B4.Value)ss=ss+","+!Str(T油石压力B0.Value)ss=ss+","+!Str(T油石压力B1.Value)ss=ss+","+!Str(T油石压力B2.Value)ss=ss+","+!Str(T油石压力B3.Value)ss=ss+","+!Str(T油石压力B4.Value)ss=ss+","+!Str(T加工时间B0.Value)ss=ss+","+!Str(T加工时间B1.Value)ss=ss+","+!Str(T加工时间B2.Value)ss=ss+","+!Str(T加工时间B3.Value)ss=ss+","+!Str(T加工时间B4.Value)i=1con="" '最终存储的字符串WHILE i<=50if i=Index.Value+1 then '使用新拼接的字符串con=con+ss+"\n"ELSE '使用原有的配置文件con=con+ names[i]+"\n"ENDIFi=i+1ENDWHILE!FileWriteByStr("$MCGS_DIR_USER/qcfg.csv",con,FILE_TRUNC,TEXT_UTF8)'写入配置文件数据读写.Refresh()
参数编辑.Close()
设置为当前配置,就是把已经读取的配置文件,赋值给正在加工的变量里面,主要就是赋值,代码省区。从备份当前配置,是把当前的的配置,赋值给编辑页面,代码也不贴了。
导入和导出,就是给这个配置文件拷贝到u盘,或者从u盘拷贝到触摸屏。用的FileCopy。
如果有更好的方法,欢迎来指导。由于项目涉及到商业问题,代码暂时不能上传,可以私信。