直接使用U盘,方便人机界面与计算机数据交换,无需CF/SD卡等的读卡器。 目前支持的功能包括, 数据记录数据在U盘之间的传送。 使用方法: 在画面脚本中,使用 Datalogging2UDisk(0); 或者 Datalogging2EasyUDisk(0); 指令语句,可以实现数据记录数据在U盘之间的传送。 其中, Datalogging2UDisk 适用于自带USB 主接口的人机界面机型,例如TP106PT、TP110VT、TP204T、TP207T、TP210T等。 Datalogging2EasyUDisk适用于不带USB 主接口的人机界面机型,但此时需要一个额外的串口转USB的外置工具。 利用先进脚本控制功能特性,甚至你可以编写出完整的PLC控制程序,这样你不需要再PLC里编写任何控制程序。 惊讶么? PLC仅仅起IO输入/输出作用。 为什么要这么做呢?
因为脚本语言,比梯形图形式的比较判断等看起来更容易理解。 何况,脚本里面还可以直接使用变量定义方式呢,你可以在下面完整的例子中找不到一个直接地址的引用,因为它全部采用了变量定义、并且是中文变量名呢。 相信你很容易读懂程序。并且你可以在应用案例区下载到完成的例子程序、或者直接复制下面的脚本,放到TP触摸屏里去运行(唯一要做的就是随意地做一个变量定义,只要每个变量使用不重叠的地址即可)。 本文要实现的功能是: 通过压缩机、加热器,控制系统温度按一定的曲线循环加热、制冷,达到指定的循环次数后停止。 |  |
本文给出了一个完整的示例。 ///////////////////////////////////////////////////////////////////// if([BB:实验状态值]==1) { if ([WS:cStProgress]<3) { [WS:cStProgress]=[WS:cStProgress]+1; } else { [WS:cStProgress]=0; } } else { [WS:cStProgress]=0; } /* 实时曲线显示范围-35到+35度 */ /* y=(100/7)*x+500 y=0-1000 x=-35 到 35 */ [WS:试验温度显示值]=100/7*[WS:试样温度AI1]+500; [WS:冷冻液温度显示值]=100/7*[WS:冷冻液温度AI2]+500; /////////////////////////////////////////////////////////////////////
/* 系统启动开关 */ if([BB:系统启动]==0&&[BB:实验状态值]==1) { [BB:压缩机状态]=0; [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:实验状态值]=0; }
if ( [BB:cDefaultDataInt] == 1 ) {
/*速冻状态值:代表制冷状态。速融状态值:代表加热状态*/ /*程序启动开始试验*/ if([BB:实验状态值]== 1 ) { /*----------------------------------总时间记时----------------------------------*/ [WS:试验总时间]=[WS:试验总时间]+1; if ([WS:试验总时间]==60) { [WS:试验总时间分]=[WS:试验总时间分]+1; [WS:试验总时间]=0; } if ([WS:试验总时间分]==60) { [WS:试验总时间时]=[WS:试验总时间时]+1; [WS:试验总时间分]=0; } /*------------------------总时间记时结束----------------------------------*/ /*----------------------------------制冷程序段开始----------------------------------*/ if ([BB:速冻状态值] ==1 && [WS:试样温度AI1] > [WS:试验温度下限]) { if( [BB:冻融液制冷停机中间值]==0) { [BB:压缩机状态]=1;} [BB:水泵状态]=1; [BB:加热管状态]=0; /*------------------------冻融液温度判断开始5-24----------------------------------*/ if ([WS:冷冻液温度AI2]<[WS:冻融液温度下限] && [BB:冻融液制冷停机中间值]==0) { [BB:冻融液制冷停机中间值]=1; } if ([BB:冻融液制冷停机中间值]==1) { [BB:压缩机状态]=0; [WS:压机报警启动中间值1]=0; [WS:压机报警启动中间值]=0; [WS:制冷等待时间秒]=[WS:制冷等待时间秒]+1; /*60秒循环*/ if ([WS:制冷等待时间秒]==60) { [WS:制冷等待时间秒] =0; [WS:制冷等待时间分]=[WS:制冷等待时间分]+1; /*分种循环*/ } if ( [WS:制冷等待时间分]>=[WS:制冷等待时间]) { [BB:冻融液制冷停机中间值]= 0; [BB:冻融液加热停机中间值]=0; [WS:制冷等待时间分]=0; [WS:制冷等待时间秒]=0; /* // [WS:压机报警启动中间值1]=0; */ /* // [WS:加热报警启动中间值1]=0; */ /* // [WS:压机报警启动中间值]=0; */ [WS:压机报警启动中间值1]=0; /*0603*/ [WS:压机报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; } } /*------------------------冻融液温度判断结束5-24----------------------------------*/ /*-----------时间记时段------------------------*/ [WS:制冷总时间]= [WS:制冷总时间]+1; /*秒*/ if([WS:制冷总时间]==60)
{ [WS:制冷总时间分]=[WS:制冷总时间分]+1; /*分*/ [WS:制冷总时间]=0; } if ([WS:制冷总时间分]==60) { [WS:制冷总时间时]=[WS:制冷总时间时]+1; /*时*/ [WS:制冷总时间分]=0; } } if ([BB:速冻状态值] ==1 && [WS:试样温度AI1] <= [WS:试验温度下限]) { [BB:压缩机状态]=0; [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:速冻状态值]=0; [BB:速融状态值]=1; [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; /*-----------5-24号-----------*/ [WS:加热等待时间秒]=0; [WS:制冷等待时间秒]=0; [WS:加热等待时间分]=0; [WS:制冷等待时间分]=0; [BB:冻融液制冷停机中间值]=0; [BB:冻融液加热停机中间值]=0; } /*------------------------制冷程序段结束----------------------------------*/ /*------------------------加热程序段开始----------------------------------*/ if ([BB:速融状态值]==1 &&[WS:试样温度AI1]<[WS:试验温度上限]) { if([BB:冻融液加热停机中间值]==0) { [BB:加热管状态]=1; } [BB:压缩机状态]=0; [BB:水泵状态]=1; /*------------------------冻融液加热温度判断开始5-24----------------------------------*/ if ([WS:冷冻液温度AI2]>[WS:冻融液温度上限] && [BB:冻融液加热停机中间值]==0) { [BB:冻融液加热停机中间值]=1; } if ([BB:冻融液加热停机中间值]==1) { [BB:加热管状态]=0; [WS:加热等待时间秒]=[WS:加热等待时间秒]+1; /*60秒循环*/ [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; if ([WS:加热等待时间秒]==60) { [WS:加热等待时间秒] =0; [WS:加热等待时间分]=[WS:加热等待时间分]+1; /*分种循环*/ } if ( [WS:加热等待时间分]>=[WS:加热等待时间]) { [BB:冻融液加热停机中间值]= 0; [BB:冻融液制冷停机中间值]= 0; [WS:加热等待时间分]=0; [WS:加热等待时间秒]=0; [WS:压机报警启动中间值1]=0; /*0603*/ [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值]=0; } } /*------------------------冻融液加热温度判断结束5-24----------------------------------*/ [WS:加热总时间]=[WS:加热总时间]+1; /*秒*/ if ([WS:加热总时间]==60) { [WS:加热总时间分]=[WS:加热总时间分]+1; /*分*/ [WS:加热总时间]=0; } if ([WS:加热总时间分]==60) { [WS:加热总时间时]=[WS:加热总时间时]+1; /*时*/ [WS:加热总时间分]=0; } } if ([BB:速融状态值]==1 &&[WS:试样温度AI1]>=[WS:试验温度上限]) { [BB:压缩机状态]=0; [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:速冻状态值]=1; [BB:速融状态值]=0; [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; /*-------------5-24-------------*/ [WS:加热等待时间秒]=0; [WS:制冷等待时间秒]=0; [WS:加热等待时间分]=0; [WS:制冷等待时间分]=0; [BB:冻融液制冷停机中间值]=0; [BB:冻融液加热停机中间值]=0; [WS:完成试验循环次数]=[WS:完成试验循环次数]+1; } /*------------------------加热程序段结束/*----------------------------------*/ } else { /*当系统处于紧急停车状态时,即[BB:实验状态值]=0的时候,所有程序停止*/ [BB:压缩机状态]=0; /* 关闭压缩机,水泵,加热管 */ [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:速冻状态值]=0; [BB:速融状态值]=0; [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; /*-----------5-24号-----------*/ [WS:加热等待时间秒]=0; [WS:制冷等待时间秒]=0; [WS:加热等待时间分]=0; [WS:制冷等待时间分]=0; [BB:冻融液制冷停机中间值]=0; [BB:冻融液加热停机中间值]=0; }
/*----------------------------------主控程序结束----------------------------------*/ /*----------------------------------压机停机时间----------------------------------*/ if ([BB:压缩机状态]==0) { [WS:压机停止时间]=[WS:压机停止时间]+1; /*秒*/ if ([WS:压机停止时间]==60) { [WS:压机停止总时间分]=[WS:压机停止总时间分]+1;/*分*/ [WS:压机停止时间]=0; } if ( [WS:压机停止总时间分]==60) { [WS:压机停止总时间时]=[WS:压机停止总时间时]+1; /*分*/ [WS:压机停止总时间分]=0; } } /*----------------------------------实验循环到达后------------------------*/ if ([WS:完成试验循环次数]==[WS:循环次数]) { [BB:实验状态值]=0; [BB:压缩机状态]=0; /* 关闭压缩机,水泵,加热管 */ [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:速冻状态值]=0; [BB:速融状态值]=0;
[WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; [WS:完成试验循环次数]=0;
[WS:年中间值END]=[WS:cBCDYear]; [WS:月中间值END]=[WS:cBCDMonthDay] >> 8; [WS:日月中间值END]=[WS:cBCDMonthDay] & 0XFF; [WS:时日月中间值END]=[WS:cBCDTime] >> 8; [WS:分日月中间值END]=[WS:cBCDTime] & 0XFF; [WS:秒日月中间值END]=0; [BB:cWinMessage]=1; /*ShowPicture("试验完毕");*/ }
/*-----------水泵报警------------------------*/
/*----制冷状态下水泵报警----//BY CXD 为什么不用“水泵报警启动中间值”?--------*/ if ([BB:水泵报警]==0&&[BB:实验状态值]==1&&[WS:压机报警启动中间值]==1) { [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:压缩机状态]=0; [BB:速冻状态值]=0; [BB:速融状态值]=0; [BB:实验状态值]=0; [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; [BB:cWinPumpAlarm]=1; /*ShowPicture("水泵报警");*/ } /*---加热状态下水泵报警----//BY CXD 为什么不用“水泵报警启动中间值”?--------*/ if ([BB:水泵报警]==0&&[BB:实验状态值]==1&&[WS:加热报警启动中间值]==1) { [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:压缩机状态]=0; [BB:速冻状态值]=0; [BB:速融状态值]=0; [BB:实验状态值]=0; [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; [BB:cWinPumpAlarm]=1; /*ShowPicture("水泵报警");*/ } /*----压机报警------------------------*/ if ([BB:压机报警]==0&&[BB:实验状态值]==1&&[WS:压机报警启动中间值]==1) { [BB:水泵状态]=0; [BB:加热管状态]=0; [BB:压缩机状态]=0; [BB:速冻状态值]=0; [BB:速融状态值]=0; [BB:实验状态值]=0; [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; [BB:cWinCompressAlarm]=1; /*ShowPicture("压机报警");*/ } /*-----------加热报警开始----------------------------------*/
/*------------------------报警条件判断值 制冷状态-----------*/ if([BB:实验状态值]==1 && [BB:压缩机状态]==1 &&[BB:水泵状态]==1) { [WS:压机报警启动中间值1]=[WS:压机报警启动中间值1]+1; } if([WS:压机报警启动中间值1]>=10) { [WS:压机报警启动中间值1]=10; } if ([BB:实验状态值]==1 &&[WS:压机报警启动中间值1]==[WS:cAlarmDelay]) { [WS:压机报警启动中间值]=1; }
/*----------------------------------加热状态------------------------*/ if([BB:实验状态值]==1 &&[BB:加热管状态]==1&&[BB:水泵状态]==1) { [WS:加热报警启动中间值1]=[WS:加热报警启动中间值1]+1; }
if([WS:加热报警启动中间值1]==10) { [WS:加热报警启动中间值1]=10; } if([BB:实验状态值]==1 &&[WS:加热报警启动中间值1]==[WS:cAlarmDelay]) { [WS:加热报警启动中间值]=1; } } /* 6553.5秒,临时与LS00031速度对比用 */ if( [WS:cStProgress]>6553 ) { [WS:cStProgress] = 0; } else { [WS:cStProgress] = [WS:cStProgress] +1; } /*BY CXD ------- “实验主画面”语言, 紧急停车 */ [BB:实验状态值]=0; [BB:速融状态值]=0; [BB:速冻状态值]=0; [BB:压缩机状态]=0; [BB:水泵状态]=0; [BB:加热管状态]=0; [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值1]=0; [WS:年中间值END]=[WS:cBCDYear]; [WS:月中间值END]=[WS:cBCDMonthDay] >> 8; [WS:日月中间值END]=[WS:cBCDMonthDay] & 0XFF; [WS:时日月中间值END]=[WS:cBCDTime] >> 8; [WS:分日月中间值END]=[WS:cBCDTime] & 0XFF; [WS:秒日月中间值END]=0; /*Call PopSetParm;*/ /* //BY CXD ------ “实验主画面”画面语言, 设置参数 */ [WS:压机报警启动中间值]=0; [WS:水泵报警启动中间值]=0; [WS:加热报警启动中间值]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值1]=0; [WS:加热报警启动中间值1]=0; /*---//BY CXD--------- 另外 试验设置 画面出现时, 还有如下初始化 ------------*/ /* 参数设置窗口显示时 [BB:LB00LS01000.0]==1 T->F 时 */ [WS:试验编号中间值]=[WS:试验编号]; [WS:总循环次数中间值]=[WS:循环次数]; [WS:试验上限中间值]=[WS:试验温度上限]; [WS:试验下限中间值]=[WS:试验温度下限]; [WS:已循环次数中间值]=[WS:完成试验循环次数]; [WS:试验日期中间值]=[WS:试验日期];
[DS:操作人员中间值]=[DS:试验人]; if([BB:实验状态值]==0 ) { [WS:年中间值]=[WS:cBCDYear]; [WS:月中间值]=[WS:cBCDMonthDay] >> 8; [WS:日中间值]=[WS:cBCDMonthDay] & 0XFF; [WS:时中间值]=[WS:cBCDTime]>> 8; [WS:分中间值]=[WS:cBCDTime] & 0XFF; [WB:秒中间值]=0; } /*Call CloseSetParmFinish;*/
/* //BY CXD ------- “试验设置”画面语言, 设置完成时 */ ClearBit([BB:cWinSetParm]); /* 关闭窗口 */ [WS:试验编号]=[WS:试验编号中间值]; [WS:循环次数]=[WS:总循环次数中间值]; [WS:试验温度上限]=[WS:试验上限中间值]; [WS:试验温度下限]=[WS:试验下限中间值]; [WS:完成试验循环次数]=[WS:已循环次数中间值]; [WS:试验日期]=[WS:试验日期中间值]; [WS:年]=[WS:年中间值]; [WS:月]=[WS:月中间值]; [WS:日]=[WS:日中间值]; [WS:时]=[WS:时中间值]; [WS:分]=[WS:分中间值]; [WS:秒]=[WS:秒中间值]; [DS:试验人]=[DS:操作人员中间值]; /* ///////////////////////程序在运行中的时候///////////////// */ if( [BB:实验状态值]==1) { if( [WS:试样温度AI1]>[WS:试验温度上限]) { [BB:速冻状态值]=1; [BB:速融状态值]=0; } if( [WS:试样温度AI1]<[WS:试验温度上限]&&[WS:试样温度AI1]>[WS:试验温度下限]) { [BB:速冻状态值]=1; [BB:速融状态值]=0; } if( [WS:试样温度AI1]<[WS:试验温度下限]) { [BB:速冻状态值]=0; [BB:速融状态值]=1; } }
[WS:水泵报警启动中间值]=0; [WS:水泵报警启动中间值1]=0; [WS:压机报警启动中间值]=0; [WS:压机报警启动中间值1]=0; [WS:压机报警启动中间值]=0; [WS:压机报警启动中间值1]=0; }
[WS:水泵报警启动中间值]=0; [WS:水泵报警启动中间值1]=0; [WS:压机报警启动中间值]=0; [WS:压机报警启动中间值1]=0; [WS:压机报警启动中间值]=0; [WS:压机报警启动中间值1]=0; }
/* //BY CXD ------- “试验设置”画面语言, "开始新试验"按钮 时 */ ClearBit([BB:cWinSetParm]); /* 关闭窗口 */ ClearBit([BB:cSetParmStart]); /* 复位开关 */ [WS:试验编号]=[WS:试验编号中间值]; [WS:循环次数]=[WS:总循环次数中间值]; [WS:试验温度上限]=[WS:试验上限中间值]; [WS:试验温度下限]=[WS:试验下限中间值]; [WS:试验人]=[WS:操作人员中间值]; [WS:完成试验循环次数]=[WS:已循环次数中间值]; [WS:年]=[WS:年中间值]; [WS:月]=[WS:月中间值]; [WS:日]=[WS:日中间值]; [WS:时]=[WS:时中间值]; [WS:分]=[WS:分中间值]; [WS:秒]=[WS:秒中间值]; [BB:实验状态值]=0; [BB:压缩机状态]=0; [BB:水泵状态]=0; [BB:加热管状态]=0; [WS:加热报警启动中间值]=0; [WS:加热报警启动中间值1]=0; [WS:压机报警启动中间值]=0; [WS:压机报警启动中间值1]=0; [WS:水泵报警启动中间值]=0; [WS:水泵报警启动中间值1]=0; [WS:cChgScreen]=15;
只要PLC设备有站号可选,TP都会支持1:16多PLC连接、并且COM1 /COM2都支持。 注:如果使用COM2连接,COM2 为RS232接口,因此需要使用COM2上的 RS-232/485 市售转换器。 | 
| TP系列规范上,无论屏的大小,都支持预定义的1:16多PLC连接。 所谓预定义,即给16个PLC设备都实行编号,例如PLC1#、PLC2#....PLC16# 分别代表连接在COM1 上的16台PLC设备。在系统参数设置中,可以一次性指定/变更各PLC实际对应的通讯协议站号,这就避免了下面这些尴尬的境况,例如: 某个PLC因故需要改变站号,如果没有采用预定义技术,就势必要逐个画面、逐个部件去修改PLC对应地址; 避免可能在不同PLC设备之间复制画面内容时,修改地址时的遗漏,可以自动一次性实现。 在画面设计应用PLC地址时,只需要按下图示意,下拉列表选择PLC#即可。 
TRE TP全系列采用昂贵的、免校正数字矩阵式触摸技术,解决永远的后顾之忧。 为什么一般的触摸屏幕会有漂移? 包括基于Windows平台或者Win CE 平台的任何触摸屏系统,只要是其指点像素达到了以1像素为单位,那它一定是采用模拟技术的触摸屏。 | | 模拟信号触摸屏,是通过AD变换电路来检测按压点对印刷的理论线性电阻的分压值、从而换算成位置信号。 既然如此,受到检测基准电压的稳定性、长期运行温度对印刷电阻的影响、印刷电阻的线性度、AD转换电路的精度和线性度、一起其他电路的稳定性等各方面综合影响。 | | 数字矩阵式触摸技术,则采用完全的矩阵式开关阵列来提供位置检测。在一个20*20像素的区域设置一个印刷的物理开关,当触摸在该区域内时,改开关统一动作。 相对而言,似乎这样的触摸屏不能完成指点到1像素。 没错。但工业现场以可靠为要求的触摸屏,其实并不需要1像素那么小的按钮。一个小手指头那么大的开关,已经远远大于20*20像素的区域了。 一方面,它避免了1像素动作的误差,导致的不可靠性。 另一方面,它的区域是固定的,不受检测电压波动、长期运行温度/湿度等环境因素的影响,可以终身免校正。 那么为什么除了世界顶尖品牌的PROFACE、以及TRE外,一般触摸屏厂家都不采用这种技术呢? 答案当然是:技术、成本。 一般模拟触摸板,都采用4线、5线等引线(接口)电路、以及单片触摸控制检测芯片,并且无论屏幕大小,除了印刷电路增加以外,并无成本的增加。 而如果640*480分辨率的触摸屏,需要按20*20划分矩阵的话,则需要分成32*24个矩阵,那么至少需要32 + 24 个引线(接口)电路,再加上与CPU核心电路的电平转换、信号保持等,接口实现技术相对复杂,成本增加。甚至可以采用FPGA等专用ASIC来实现。 所以一般触摸屏厂家都不愿意这样做。 而TRE秉承质量第一的愿望,紧紧跟随世界顶尖品牌的PROFACE,持久地采用昂贵的、免校正数字矩阵式触摸技术,解决永远的后顾之忧。 极具创新价值,适合中国国情的创新中文输入法 中国人当然需要中文输入法。 在画面设计中,放置一个文本,鼠标右键选择动画连接,然后依次选中“文本显示动画”->“字符串显示”,在“字符串显示”的对话框中,勾选允许修改,OK,下载试试看!在触摸屏上操作,就能输入中文了。 
下图为示例的屏幕键盘。 设计中文输入界面: 
触摸时自动弹出中文拼音输入键盘: 
|
|
|