将mtype与Jspin一起使用时未声明的变量错误

时间:2017-11-08 11:25:51

标签: model-checking promela spin

我是JspinPromela的新手。我试图实现以下系统:

  

家庭报警系统可以使用个人ID密钥或密码激活和停用,激活后系统进入约30秒的等待时间,允许用户撤离报警装备后的安全区域的时间,当检测到入侵时,警报具有内置的等待时间或15秒的延迟,以允许入侵者输入密码或刷卡密钥从而识别自己,如果在分配的15秒内未发出识别警报将关闭,直到使用身份证或密码取消激活它。

这是代码:

mtype = {sigact, sigdeact};
chan signal = [0] of {mtype};
/*chan syntax for declaring and initializing message passing channels*/



int count;
bool alarm_off = true; /*The initial state of the alarm is off*/

active proctype alarm()

{
off:
    if 
    :: count >= 30 -> atomic {signal!sigdeact; count = 0;alarm_off = false; goto on;}
    :: else -> atomic {count++; alarm_off = true; goto off;}
    fi;

on:
    if
    :: count >=15 -> atomic { signal!sigact; count = 0;
    alarm_off = false; goto off;}
    :: else -> atomic {signal!sigact; alarm_off = true; goto off;}
    fi;

pending:

     if
     :: count >= 30 -> atomic {count = 0; alarm_off = false; goto on;}
     :: count < 30 -> atomic {count++; alarm_off = false; goto pending;}
     fi;
}

当我使用Jspin运行代码时,我收到此消息:

Error: undeclared variable: sigact

但我在标题中声明了这一点。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

根据Promela的{​​{3}},您正确使用mtype

事实上,我无法使用spin版本6.4.3重现您的错误,因此我怀疑这是Jspin未正确更新的特定问题。

除非您想使用spin代替Jspin,否则您可以尝试以下解决方法,即使使用Jspin 也可以使用:

#define sigact   0
#define sigdeact 1
chan signal = [0] of {short};   // or bool for only 2 values

...

由于没有人从signal读取,我认为系统模型不完整,稍后会添加更多进程。

  1. 请注意,在以下指令序列中

    atomic { signal!sigdeact; count = 0; alarm_off = false; goto on; }
    

    原子性alarm signal 0因为off同步频道(它的大小为count >= 30 })所以另一个进程必须立即安排读取正在发送的消息。

  2. count州,当0alarm_off = false重置为on时,请设置on,然后转到州alarm_off }。在true州,您立即将pending设置回alarm。这是有意的吗?看起来有些错误,也许你打算去州input

  3. 通过阅读系统说明,signal似乎缺少某种pending信号。我怀疑您使用的off频道与其预期目的不同。

  4. 如果正确的个人ID / 密码,该模型是否应该从状态public class NewsBlock : BlockData { [CultureSpecific] [Display( Name = "Heading", Description = "Add a heading.", GroupName = SystemTabNames.Content, Order = 1)] public virtual String Heading { get; set; } } 转换为public class NewsBlockController : BlockController<NewsBlock> { // GET: NewsBlock public override ActionResult Index(NewsBlock currentBlock) { // apistuff ApiModelWhatever returnFromApi = "whatever"; var model = new LatestNewsViewModel(currentBlock, returnFromApi); return PartialView(model); } } em>被使用了吗?