有难度,这个是PLC模拟器,应该用现成的,否则可以当成商业软件开发了。

解决方案 »

  1.   

    现成的有很多啊,至少各种单片机都有模拟程序,PLC不会比他们更难。
      

  2.   

    哈哈,我真的有点不知如何下手,能否指教
    [email protected]
      

  3.   

    我想重要的是先做系统分析,设计数据结构.
    你把资料贴上来,要不发妹儿给我.
    [email protected]
      

  4.   

    用的PLC是西门子的,给学生做实验用S7-200,S7-200与PC通信得用自由口协议,通信程序好编,与其他PLC不同的是,S7-200上也得编一点通信程序。其实我是愿意用通信口交互数据的,省做一个接口板。但我想做一个实验装置,在PC上插一块812PG数据采集卡,我再做一块接口板,将接口板的输出和PLC的DI接上,PLC的DO和接口板的输入接上。PC机上可对板卡DI/DO操作,即对PLC DI/DO操作。这样,我就可在PC机上对PLC调试了(S7-224只有14DI/10DO),PC机上简单的拨动I/O开关,看输出,很简单,也没必要如此做。第一步,我就是想在要求输入有时序时,可让用户输入I/O时序要求,然后我的程序按此要求顺序向PLC输入DI信号,在同时读出PLC DO,看对不对,不对则程序报错。对则程序按顺序执行。第二步,就是学生直接按流程工步的概念,输入流程,我的程序将他翻译,以一定时序的DI向PLC输入。我觉的难点就在我的程序如何反映流程及时序。一步的输入还得考虑上一次的输出。。
      

  5.   

    西门子自己有一套plcsim可模拟,你找找看看。不过我没有。
      

  6.   

    我看得分成两个部分,一个是流程输入,即小型的编译器,一个是信号仿真,作为执行内核。
    如果你的数据采集卡有驱动程序就好,最好能实时响应,前端编译器(不一定是编译,只要能生成执行内核的指令即可)把流程按时序一次性翻译成指令码,就是说一个16位的字(用其中14位代表DI)代表一段时序中的输入,内核把指令码逐条发给PLC,然后内核循环等待每一条指令的结果(把10位DO合并在一个字中),如果与流程要求相符,则执行下一条指令,不符则执行下一条指令。
      

  7.   

    我的数据采集卡有驱动程序,DI(即为PLC的DO),DO(即为PLC的DI)
    程序的确得分两部分,1 流程的输入    2  仿真
    我不知道如何将流程翻译成我的数据采集板的输出,还有怎样采集PLC的输出来检测PLC程序对错,因为有的逻辑关系比较复杂。
      

  8.   

    如果有以下流程(+/-代表开关):
    |------------>|
    |++>|-------->|
    |----->|+++++>|
    |++++++++++++>|
    很明显,时序为0101,0101,0101,0001,0001,0001,0001,0011,0011,0011,0011,0011,0011,0000。
    你需要自己设计一种语言或输入方法,一定要把流程分解成时序。
      

  9.   

    你的流程是什么样子,发一个DEMO给我吧!!
      

  10.   

    关键是流程不定呀,当然先作成简单的,顺序控制的。
    我原先想用表格的形式由用户输入,DI,DO,而且下一DI还要判断DO的真确,
    但有时,发出DI后,并不是就有DO,而可能是定时期等,所以觉的关系挺复杂的。
    我给你一篇文章吧,PDF格式的,我想最终目标作成那样,当然现在是简单的
      

  11.   

    我现在也在编写PLC的模拟程序,我的是华光公司的PLC,有兴趣的话,大家可以一起讨论讨论。
      

  12.   

    那好呀,多讨论,我的是西门子[email protected]
      

  13.   

        对呀,我的意思也是让用户设定每一工步的输入信号,用户设定该工步的输出。然后程序读用户的输入,并向PLC的DI发信号,但我觉的判断PLC的输出正确与否比较难。因为,我要以次作为下一步输入的前提条件。但DO的输出,即一个工步向另一个工步的转换可能是外部的传感器输入(如我的PC机发的DI信号)引起,也可能是PLC内部定时器,计数器引起,所以判断起来比较麻烦。还有就是选择分支,并行分支等。
    我就觉的让用户输入的这张表难。
      

  14.   

    既然你坚持不愿用户自己设定输入输出,那我们另外想办法,我想可以这样:
    我们分析实际机械部件,实际机械部件都可以定义为一个时间器件Q或器件组Qs,Q有一个输出和一个输入,输入到输出有一个时间间隔t,这样事情就好办了,比如一段传送带,马达收到一个信号DO1,启动皮带,经过时间t1 = 20s,输出一个信号DI1,PLC收到后给出指令DO2,经过时间t2 = 0.1s ,刹车停住,同时返回PLC一个信号DI2,此处有两个器件Q构成器件组,就是一个基本的系统。
       因此,一个基本的系统是全部由PLC和器件交互的系统,你编程时给每个器件定义为一个数据对象:
    class PLCObject
    {
        int QI;
        int t;
        int QO;
    }
    PLCObject q1;
    q1.QI = DO1;
    q1.t = 20;
    q1.QO = DI1;
    全部器件定义为一个链表或数组均可,主程序(可以在一个Time中)循环扫描,对到时间的对象进行输入输出操作.
        对于复杂的系统,器件间有不经过PLC的交互作用,它们可能互相交互,体外循环,PLC不能了解系统的全貌,那样的话,QI和QO要定义为数组,主程序扫描过程也更加复杂,但原理相差应该不大。
        这样,使用者要做的就是定义部件,而不是定义输入输出,可以用描述语言也可以用图形方式,我想该差不多了吧。
      

  15.   

    我的意思是让用户自己设定输入输出呀,并不是定义器件呀,因为器件太多了,你的想法和我一样,我也想定义一类。即工步类。大体如下:
    type                                     //plc 工步定义
      TDI_Type=(DI_0,DI_1,DI_2);
      TDO_Type=(DO_0,DO_1);
      TAlarm_type=(No_Alarm,Alarm_1,Alarm_2);  PPLC_Data=^TPLC_Data;            //工步指针
      
      TPLC_Data=record                     //每一工步数据类型
        DI_state:array[0..13] of TDI_Type;        // DI
        DO_state:array[0..9] of TDO_Type;         //DO
        overtime:integer;
        choice:boolean;
        choice_number:integer;                   //选择分支数
        choice_selecter:integer;                //选择分支
        Alarm_type:TAlarm_type;                //PLC错误类型
        Later_step:array[0..9] of PPLC_Data;   //下一工步
      end;1、DI,DO 。所有初值为0。 
    学生输入时也不必写太麻烦,每一工步处只写出不为0的点。如写成:DI0,DI3,DI7,DO2,DO5,表示数据DI[0],DI[3],DI[7],DO[2],DO[5]为1,其余0。让学生输入表格时怎么转换。以什么形式输入2、Timer_value:integer=99999999999999999-----;初值给一记数最大值就行。 
    从进入该工步(满足DI条件,一进入该工步就会对该工步要求的PLC的DI信号进行设定)到完成该工步(即满足DO条件,当PLC给出预定的DO信号时,表示该工步正确完成)的最长时间。 
    为防止PC在该步进入死循环,超过这一时间就表示程序出错。定义一个报警信息号码,现定为1。 WATCHDOG 时间3、choice:BOOLEAN=FALSE;该工步结束后是否为选择分枝点。 
    Static int number=1; 流程分枝的数目。 
    注:进入流程选择时应该有一外部输入信号以决定往后如何运行。 
    根据实际需要定义这个外部选择变量。 
    我暂定为:selector:integer=0; 当choice=True时,与其它不同的是,决定该工步是否往下执行的不是DI/DO而是selector,当它不为0时,即表示实验者已经输入要检验的流程分枝号码,可往下执行。 4、Alarm:integer=0; 该工步出错时的报警信息编码。 
    在另一字串数组中定义好报警信息。如1为“PLC运行超时”,2为“不正确的DO输出(当有一额外的DO=1出现)”------------,当Alarm!=0时,显示相应的信息。 5、Later_step:array[0..9] of PPLC_Data
    就是用来存放后续工步数据指针的指针数组。 
    顺序流程时只有一个指针,在工步结束时将它付给当前工步指针即可,而当choice=True时,为一数组,当selector!=0时,将相应位置存放的指针付给当前工步指针就可进入下一工步。 我觉的让用户输入条件比较难,还有判断PLC输出正确与否比较难
      

  16.   

    器件相对简单,工步较复杂,随着器件的增多,由于器件的交互作用,工步复杂度会以几何速度递增,不足取。因为我们要仿真的不是PLC程序,而是物理世界。你的模型和文献上相同,也和我开始想的一样,缺点就在于判断表格太复杂,如果学生能写出这样的数据表,他的PLC程序可能也不需要调试了。