技术论坛

 1500plc+HMI制作一个年会随机抽奖程序

返回主题列表
作者 主题
奔驰的稻草人
游侠

经验值:345
发帖数:5
精华帖:2
楼主    2022-02-11 11:30:30
主题:1500plc+HMI制作一个年会随机抽奖程序 精华帖 

单位年会年年有,,抽奖活动必不可少,制作一个抽奖软件一般都是IT人员的工作,身为一个工控人,怎么能谦让呢,今年用西门子1500plc+HMI制作一个抽奖程序,年会现场没有硬件,于是使用西门子的plcsim仿真加电脑屏幕投影。

程序框架是疫情隔离时没事干花了俩小时写出来的,有些地方写的可能比较乱,变量名字很多用的汉语,多包涵,hmi画面制作的时间比较长。

使用软件版本TIA15.1

功能:随机抽取人名,随机抽奖,被抽取的人和奖品不在出现,最后可将结果保存在电子表格内,抽奖人数最大99人,

帖子上传了好几次都不能把程序上传完整,上传后部分程序就丢失了,所以下面程序只是部分内容,附件超出了帖子规定大小,也无法上传,附个链接供大家下载吧

抽奖程序附件链接

画面一,欢迎界面


画面2-设置人名和奖品画面

画面三-抽奖画面


触摸屏和plc程序代码:

//Check_Fild

Dim FSO ,Myfile  'FSO:访问系统文件的一个对象,Myfile:访问文件

Set FSO=CreateObject("s cripting.filesystemobject")   '创建访问系统文件

If FSO.FileExists("C:Storage Card SDLogs?1NewYearParty.csv")=True Then     '如果存在文件

Call Write_Date'调用write_date函数

Else

Set Myfile=FSO.CreateTextFile("C:Storage Card SDLogs?1NewYearParty.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("s cripting.filesystemobject")

If FSO.FileExists("C:Storage Card SDLogs?1NewYearParty.csv")=True Then    '检查如果文件存在,然后

FSO.DeleteFile ("C:Storage Card SDLogs?1NewYearParty.csv") '删除文件

End If

Set FSO=Nothing

End Sub

//Write_Date

Dim FSO,MyFile   'FSO:访问系统文件的一个对象,Myfile:访问的文件

Set FSO=CreateObject("s cripting.filesystemobject")   'set语句创建访问系统的对象并用set进行对象引用

Set MyFile=FSO.OpenTextFile("C:Storage Card SDLogs?1NewYearParty.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];

 

&nbs

仰天大笑出门去我辈岂是蓬蒿人
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。