今年马上结束了,单位又要举行年会,抽奖活动必不可少,制作一个抽奖软件一般都是IT人员的工作,身为一个工控人,怎么能谦让呢,今年用西门子1500plc+HMI制作一个抽奖程序,年会现场没有硬件,于是使用西门子的plcsim仿真加电脑屏幕投影。
使用软件版本TIA15.1
功能:随机抽取人名,随机抽奖,被抽取的人和奖品不在出现,最后可将结果保存在电子表格内,抽奖人数最大99人,
画面一,欢迎界面
画面2-设置人名和奖品画面
画面三-抽奖画面
触摸屏和plc程序代码:(详细可下载附件查看)
//Check_Fild
Dim FSO ,Myfile 'FSO:访问系统文件的一个对象,Myfile:访问文件
Set FSO=CreateObject("scripting.filesystemobject") '创建访问系统文件
If FSO.FileExists("C:\Storage Card SD\Logs\2021NewYearParty.csv")=True Then '如果存在文件
Call Write_Date'调用write_date函数
Else
Set Myfile=FSO.CreateTextFile("C:\Storage Card SD\Logs\2021NewYearParty.csv")'利用creat方法创建文件,并将对象返回到Myfile中
Myfile.WriteLine "编号,时间,人名,奖品"'利用writeline函数对新建的文件写入表头
Myfile.Close'关闭文件
Call Write_Date'调用write_date函数
Set Myfile=Nothing'释放对象
End If
Set FSO=Nothing
End Sub
//Delete_File
Dim FSO
Set FSO=CreateObject("scripting.filesystemobject")
If FSO.FileExists("C:\Storage Card SD\Logs\2021NewYearParty.csv")=True Then '检查如果文件存在,然后
FSO.DeleteFile ("C:\Storage Card SD\Logs\2021NewYearParty.csv") '删除文件
End If
Set FSO=Nothing
End Sub
//Write_Date
Dim FSO,MyFile 'FSO:访问系统文件的一个对象,Myfile:访问的文件
Set FSO=CreateObject("scripting.filesystemobject") 'set语句创建访问系统的对象并用set进行对象引用
Set MyFile=FSO.OpenTextFile("C:\Storage Card SD\Logs\2021NewYearParty.csv",8)'利用OpenTextFile函数打开指定文件,并用Myfile进行对象引用
'OpenTextFile参数说明:(“文件路径”,打开模式【1:只读 2:写 8:在最后一行写入】)
MyFile.WriteLine MyFile.Line-1&","&Time()&","&SmartTags("HMI_随机人名显示")&","&SmartTags("HMI_随机奖品名显示")
'将编号、时间、人名、奖品名变量写入到Excel文件中
MyFile.Close'关闭文件
Set FSO=Nothing'释放对象
Set MyFile=Nothing
End Sub
//开机时初始化
IF "FirstScan" THEN
#抽奖次数 := 99;
#中奖人 := 101;
"确认" := 1;
"复位提示" := 1;
END_IF;
//复位中奖人单和奖品名背景色
IF "抽奖重新开始" THEN
FOR #i := 0 TO 99 DO
"HMI".中奖人名变色[#i] := 0;
"HMI".中奖奖品变色[#i] := 0;
END_FOR;
IF #人数 > 99 THEN //抽奖人数不能大于99人
#人数 := 0;
#中奖人 := 103; //103表示人数超上限
END_IF;
#R_TRIG_Instance_2(CLK:=#RESET OR "FirstScan" , //数列复位
Q=>#R_TRIG_Instance_2.Q);
IF #R_TRIG_Instance_2.Q THEN
FOR #j := 0 TO 109 DO
#站队[#j] := #j + 1;
END_FOR;
#n := 20;
#中奖人 := 102; //102代码表示请抽奖
#抽奖次数 := 0;
"抽奖" := 0;
END_IF;
FOR #i := 0 TO 99 DO //序列重新排队
IF #站队[#i] > #站队[#i + 1] THEN
#战队temp := #站队[#i];
#站队[#i] := #站队[#i + 1];
#站队[#i + 1] := #战队temp;
END_IF;
END_FOR;
#R_TRIG_Instance(CLK:=#抽奖, //点击抽奖
Q=>#R_TRIG_Instance.Q);
IF #R_TRIG_Instance.Q THEN
#中奖人 := #站队[#n];
#n_timp := #n;
END_IF;
#中奖人名 := "抽奖人名单".中奖人名单[#中奖人 - 1];
#随机人 := #站队[#n];
#R_TRIG_Instance_1(CLK := #确认, //对抽奖结果确认
Q => #R_TRIG_Instance_1.Q);
IF #R_TRIG_Instance_1.Q THEN
#站队[#n_timp] := 100;
#中奖人 := 102; //等待抽奖
#抽奖次数 := #抽奖次数 + 1;
END_IF;
#n := #n + 1;//随机数,因博图中无随机数,所以采取让n快速自增的方法。
IF #n >= #人数 - #抽奖次数 THEN
#n := 0;
END_IF;
IF #抽奖次数 >= #人数 THEN //抽奖次数大于人数时,提示抽奖结束
#中奖人 := 101; //101表示抽奖结束
END_IF;
END_IF;
//中奖人单背景变色
IF "中奖人" < 100 THEN
IF "抽奖" = 1 THEN
#j := "中奖人";
"HMI".中奖人名变色[#j] := 1;
END_IF;
#n:= "中奖人";
IF "再给次机会"=1 THEN
"HMI".中奖人名变色[#n] := 0;
END_IF;
END_IF;
//中奖奖品名背景变色
IF "中奖名" < 100 THEN
IF "抽奖_JP" = 1 THEN
#j := "中奖名";
"HMI".中奖奖品变色[#j] := 1;
END_IF;
#n := "中奖名";
IF "再给次机会_JP" = 1 THEN
"HMI".中奖奖品变色[#n] := 0;
END_IF;
END_IF;
//HMI显示块
//"随机显示人名"
IF "抽奖" = 0 THEN
"HMI".随机人名显示 := "抽奖人名单".中奖人名单["随机人" - 1];
ELSE
"HMI".随机人名显示 := "抽奖人名单".中奖人名单[ "中奖人"- 1];
END_IF;
//"随机显示奖品名"
IF "抽奖_JP" = 0 THEN
"HMI".随机奖品名显示 := "奖品名单".中奖人名单["随机奖品" - 1];
ELSE
"HMI".随机奖品名显示 := "奖品名单".中奖人名单["中奖名"- 1];
END_IF;
//检查人名单是否有重名
FOR #a := 0 TO 98 DO
FOR #b := #a+1 TO 99 DO
IF "抽奖人名单".中奖人名单[#a] = "抽奖人名单".中奖人名单[#b]
AND "抽奖人名单".中奖人名单[#a] <> #no_name THEN
"抽奖人名单".中奖人名 := "抽奖人名单".中奖人名单[104];
"HMI".相同人名报警 := 1;
// ELSE
END_IF;
END_FOR;
END_FOR;
IF "抽奖人名单".中奖人名 <> "抽奖人名单".中奖人名单[104] THEN
"HMI".相同人名报警 := 0;
END_IF;
//统计人名单人数
#c := 0;
FOR #d := 0 TO 99 DO
IF "抽奖人名单".中奖人名单[#d] <> #no_name THEN
#c := #c + 1;
END_IF;
END_FOR;
"人数" := #c;
//统计奖品数量
#e := 0;
FOR #d := 0 TO 99 DO
IF "奖品名单".中奖人名单[#d] <> #no_name THEN
#e := #e + 1;
END_IF;
END_FOR;
"奖品数" := #e;
//如果奖品数量低于人数,则报警
IF "奖品数" < "人数" THEN
"HMI".奖品少报警 := 1;
ELSE
"HMI".奖品少报警 := 0;
END_IF;
IF #奖品数 > 99 THEN //奖品数不能大于99人
#奖品数 := 0;
#中奖名 := 103; //103表示数量超上限
END_IF;
#R_TRIG_Instance_2(CLK:=#RESET OR "FirstScan" , //数列复位
Q=>#R_TRIG_Instance_2.Q);
IF #R_TRIG_Instance_2.Q THEN
FOR #j := 0 TO 109 DO
#站队[#j] := #j + 1;
END_FOR;
#n := 20;
#中奖名 := 102; //102代码表示请抽奖
#抽奖次数 := 0;
"抽奖_JP" := 0;
END_IF;
FOR #i := 0 TO 99 DO //序列重新排队
IF #站队[#i] > #站队[#i + 1] THEN
#战队temp := #站队[#i];
#站队[#i] := #站队[#i + 1];
#站队[#i + 1] := #战队temp;
END_IF;
END_FOR;
#R_TRIG_Instance(CLK:=#抽奖, //点击抽奖
Q=>#R_TRIG_Instance.Q);
IF #R_TRIG_Instance.Q THEN
#中奖名 := #站队[#n];
#n_timp := #n;
END_IF;
#中奖人名 := "奖品名单".中奖人名单[#中奖名 - 1];
#随机奖品 := #站队[#n];
#R_TRIG_Instance_1(CLK := #确认, //对抽奖结果确认
Q => #R_TRIG_Instance_1.Q);
IF #R_TRIG_Instance_1.Q THEN
#站队[#n_timp] := 100;
#中奖名 := 102; //等待抽奖
#抽奖次数 := #抽奖次数 + 1;
END_IF;
#n := #n + 1;//随机数,因博图中无随机数,所以采取让n快速自增的方法(大约1s自增一千次)。
IF #n >= #奖品数 - #抽奖次数 THEN
#n := 0;
END_IF;
IF #抽奖次数 >= #奖品数 THEN //抽奖次数大于人数时,提示抽奖结束
#中奖名 := 101; //101表示抽奖结束
END_IF;
//开机时初始化
IF "FirstScan" THEN
#抽奖次数 := 99;
#中奖名 := 101;
"确认_JP" := 1;
"复位提示" := 1;
END_IF;
楼主最近还看过