Hệ thống báo động, báo cháy mức trừu tượng

Một phần của tài liệu Kiểm chứng tính đúng đắn hệ thống tính toán của chương trình bằng kiểm duyệt mô hình (Trang 49)

4. Cấu trúc luận văn

3.2.Hệ thống báo động, báo cháy mức trừu tượng

3.2.1. Mô tả hệ thống mức trừu tượng

Nhiệm vụ chính của hệ thống là báo động mỗi khi phát hiện có động xảy ra. Có thể mô tả hệ thống ở mức tổng quát như sau:

Hệ thống báo động bao gồm các Sensors để phát hiện động (từ môi trường), bảng điều khiển Control Panel, và chuông báo Alarm. Khi các Sensors nhận được thông báo có động từ môi trường gửi tới, nó sẽ gửi thông báo này cho bảng điều khiển Control Panel, ngay sau đó thông báo này cũng sẽ được truyền tới chuông báo Alarm từ Control Panel. Tại đây Alarm sẽ phát âm thanh (chuông báo) để thông báo có động. Hệ thống này không chỉ có mục đích báo động mà còn báo cháy.

Vấn đề đặt ra ở đây là hệ thống phải đảm bảo hoạt động đúng chức năng, có nghĩa là bất cứ khi nào có động thì hệ thống phải báo chuông. Để mô tả tính chất này cần sử dụng công thức LTL: “Bất kỳ khi nào có động -> <> chuông phải báo”.

Từ những mô tả trên có thể đưa ra kiến trúc trừu tượng của hệ thống báo động, báo cháy như sau:

Hình 3.1: Kiến trúc trừu tượng của hệ thống báo động, báo cháy

Sensor 1 Sensor 2 Sensor n

Alarm Control Panel

Enviroment

env env env

control_sensor

control_sensor control_sensor

3.2.2. Mô hình Promela cho hệ thống báo động, báo cháy mức trừu tượng và kiểm chứng thuộc tính đơn giản và kiểm chứng thuộc tính đơn giản

Từ mô tả hệ thống báo động, báo cháy như trên, ta xây dựng mô hình cho hệ thống bằng ngôn ngữ Promela áp dụng cho hệ thống có 5 Sensors bao gồm: Các tiến trình environment(), sensors(i), alarm(), và control(). Các tiến trình giao tiếp với nhau qua các kênh thông điệp. Hệ thống có mục đích báo động, báo cháy tương ứng với hai sự kiện breaker (trộm) và fire (cháy) được khai báo trong mtype:

mtype = {breaker, fire};

Mô tả các biến toàn cục của chương trình:  chan env=[0] of {mtype,byte};

Biến kênh env thể hiện sự giao tiếp giữa môi trường Environment

Sensors. Kênh này xác định môi trường gửi thông báo động loại gì cho Sensor

nào, chẳng hạn env!breaker,3; có nghĩa môi trường gửi thông báo có trộm cho

Sensor 3.

chan control_sensor=[0] of {mtype,byte};

Biến kênh control_sensor thể hiện sự giao tiếp giữa SensorsControl Panel, kênh này khi gửi (nhận) thông báo sẽ xác định được là có động loại nào (trộm (breaker) hay cháy (fire)) và động tại Sensor nào, chẳng hạn

control_sensor?fire,2; có nghĩa là kênh control_sensor nhận thông báo cháy từ

Sensor 2.

chan control_alarm=[0] of {mtype};

Biến kênh control_alarm thể hiện sự giao tiếp giữa Control Panel và chuông báo Alarm. Qua kênh này khi Alarm nhận được thông báo có cháy hay trộm thì đều xử lý để phát âm thanh báo động, chẳng hạn

control_alarm?breaker;.  bit sound;

Biến sound kiểu bit thể hiện khi sound=1 là phát âm thanh, sound = 0 thì ngừng phát.

bit move;

Biến move kiểu bit được sử dụng như lính canh, khi môi trường bắt đầu có động thì move = 1. (adsbygoogle = window.adsbygoogle || []).push({});

Các tiến trình: Hệ thống báo động, báo cháy mức trừu tượng được mô tả qua 8 tiến trình: environment(), sensors(i) (i=1..5), alarm(), và control().

 Tiến trình environment:

proctype environment(){ show byte j=1;

do ::j<=5 -> atomic{env!breaker,j;move=1;j=j+1}; :: j<=5 -> atomic{env!fire,j;move=1;j=j+1}; ::j>5-> break; od }

Tiến trình environment giả lập một môi trường thông báo động tới

sensors(i)(i=1..5), mỗi khi có động biến move nhận giá trị 1 (move = 1).  Tiến trình sensors:

proctype sensors(byte i){ end: do

::env?breaker,i->control_sensor! breaker,i; ::env?fire,i->control_sensor! fire,i; od

}

Tiến trình sensors khi nhận được thông báo có động từ môi trường (cháy –

fire hay trộm – breaker) qua kênh env thì nó sẽ gửi thông báo đó cho Control Panel qua kênh control_sensor. Tại đây Control Panel sẽ nhận được thông báo động loại gì và do Sensor nào gửi tới.

 Tiến trình alarm: proctype alarm(){ end: do ::control_alarm?breaker->sound=1; ::control_alarm?fire->sound=1; od }

Trong tiến trình alarm, mỗi khi Control Panel nhận được thông báo có động (cháy hay trộm) từ control_sensor, nó sẽ gửi thông báo này tới Alarm qua kênh control_alarm để Alarm phát chuông báo động (sound = 1).

 Tiến trình control: proctype control(){ byte k; bit b; bit f; end: do ::b==0 && f==0 -> end1: if :: control_sensor?breaker,k -> b=1;

:: control_sensor?fire,k -> f=1; fi; ::b==1 -> atomic{control_alarm! breaker; b=0}; ::f==1 -> atomic{control_alarm!fire; f=0}; od }

Tiến trình control điều khiển nhận thông báo khi có động từ các Sensors

qua kênh control_sensor và gửi thông báo động cho Alarm qua kênh

control_alarm.

 Và tiến trình init:

init {

atomic{

run environment();

run sensors(1);run sensors(2);

run sensors(3);run sensors(4);run sensors(5); run alarm();

run control(); } }

Mô phỏng chương trình trên trong Xspin không có lỗi và được kết quả sau:

Hình 3.2: Kết quả khi mô phỏng mô hình hệ thống báo động, báo cháy mức trừu tượng

Sau khi chạy mô phỏng chương trình như trên, cần kiểm tra tính chất mà hệ thống phải thỏa mãn bằng việc chạy verify. Tính chất cần kiểm chứng của hệ thống báo động, báo cháy mức trừu tượng là: “bất cứ khi nào có động, hệ thống đều phải báo”.

Biểu thức LTL mô tả tính chất trên là: [](move-><>sound)

Spin sẽ tự động sinh ra cấu trúc never claim khi thêm công thức LTL trên. Kết quả chạy verify cho thấy không có lỗi vi phạm do vậy hệ thống thỏa mãn tính chất cần kiểm tra. (adsbygoogle = window.adsbygoogle || []).push({});

Hình 3.3: Kết quả kiểm chứng mô hình hệ thống báo động, báo cháy

Phân tích kết quả trên thấy errors: 0 nên mô hình đưa ra thỏa mãn thuộc tính đã nêu.

3.3. Hệ thống báo động, báo cháy mức 2 3.3.1. Mô tả hệ thống mức 2 3.3.1. Mô tả hệ thống mức 2

Hệ thống báo động, báo cháy mức 2 là sự mở rộng của mức trừu tượng. Ngoài các chức năng đã được mô tả trong 3.2.1 cần bổ sung thêm các chức năng khác. Đặc biệt ở mức 2 của hệ thống được xây dựng thêm biến đồng hồ (time) và tiến trình đồng hồ (clock). Tiến trình đồng hồ có mục đích là thiết lập thời gian khi cần thiết qua kênh set_time và đếm thời gian trôi đi kể từ khi có động cho tới khi chuông phát âm báo động qua biến đồng hồ time. Do đó tiến trình đồng hồ sẽ được nối với môi trường (Environment) – xác định thời điểm có động, với Control panel, và với Alarm – xác định thời điểm chuông reo. Từ đó

sẽ xác định được khoảng thời gian từ khi có động đến khi báo động. nói cách khác, nhờ xây dựng tiến trình đồng hồ (clock) và biến đồng hồ (time) ta có thể đưa ràng buộc thời gian thực vào hệ thống báo động, báo cháy qua assertion. Cụ thể, thời gian từ khi có động đến khi chuông báo động reo phải không vượt quá 5 giây (báo động phải đủ nhanh). Thêm vào đó trong tiến trình đồng hồ còn thực hiện tăng thời gian (qua biến đồng hồ time) cho mỗi hành động mất thời gian xảy ra, điều này được thực hiện qua kênh inc.

Từ mô tả hệ thống như trên ta có thể đưa ra kiến trúc hệ thống như sau:

Hình 3.4: Kiến trúc mức 2 của hệ thống báo động, báo cháy

3.3.2. Mô hình Promela cho hệ thống báo động, báo cháy mức 2 và kiểm chứng thuộc tính đơn giản chứng thuộc tính đơn giản

Từ mô tả hệ thống như trên, ta xây dựng mô hình cho hệ thống bằng ngôn ngữ Promela áp dụng cho hệ thống có 5 Sensors bao gồm các biến và tiến trình như ở mức trừu tượng và được bổ sung thêm một vài biến, các thành phần trong các tiến trình ở mức trừu tượng, và tiến trình clock như sau:

Các biến toàn cục:

chan set_time=[0] of {int};

Biến kênh set_time để thiết lập thời gian khi muốn đo thời gian set_time!1, và khi không dùng đồng hồ để đo thời gian thì set_time!-1.

control_alarm set_time control_sensor control_sensor control_sensor

env env env

Sensor 1 Sensor n Sensor 2 Alarm Control Panel Enviroment Clock set_time inc

chan inc=[0] of {int};

Biến kênh inc để tăng thời gian mỗi khi có hành động mất thời gian xảy ra.  int time;

Biến đồng hồ time để đếm thời gian khi cần thiết, sau mỗi hành động mất thời gian time sẽ được tăng lên giá trị c nào đó.

Các tiến trình: Hệ thống báo động, báo cháy mức 2 được mô tả qua 9 tiến trình: environment(), sensors(i) (i=1..5), clock(), alarm(), và control().

 Tiến trình environment: proctype environment(){ show byte j=1; do ::j<=5 -> atomic{env!breaker,j; set_time!1;move=1;j=j+1}; ::j<=5 -> atomic{env!fire,j; set_time!1;move=1;j=j+1}; ::j>5-> break; od }

Tiến trình environment ở mức 2 có thêm lệnh set_time!1; mục đích là để thiết lập thời gian hay bắt đầu tính thời gian khi có động.

 Tiến trình sensors: Giống như tiến trình sensor ở mức trừu tượng.  Tiến trình clock: proctype clock() { show int c; time=-1; end: do ::set_time?1->if ::time=-1->time=0; ::else->skip; fi; ::set_time?-1->time=-1; ::inc?c->if ::time!=-1->time=time+c; :: else -> skip; fi; od }

Ban đầu biến đồng hồ time = -1, tức là chưa dùng đồng hồ. Khi kênh

hồ lúc này được thiết lập bằng 0 (time = 0). Tuy nhiên việc thiết lập biến đồng hồ time ở đây chỉ được thực hiện nếu time chưa được thiết lập trước đó (time = - 1), nếu đã được thiết lập rồi thì giữ nguyên giá trị của time. Khi kênh set_time

nhận giá trị -1 (set_time?-1), tức là lúc này không dùng đến đồng hồ thì biến đồng hồ time không được thiết lập hay time = -1. Khi kênh inc nhận giá trị c

(thời gian cần cho hành động mất thời gian nào đó) sẽ kiểm tra nếu biến đồng hồ đang được đếm hay đồng hồ đang được dùng (time!=-1) thì tăng giá trị của biến đồng hồ thêm c, còn ngược lại thì giữ nguyên giá trị của time.

 Tiến trình alarm: proctype alarm(){ end: do ::atomic{control_alarm?breaker-> sound=1;assert(time<=5);sound=0;set_time!-1;} ::atomic{control_alarm?fire-> sound=1; assert(time<=5);sound=0;set_time!-1;} od }

Tiến trình alarm có thêm ràng buộc thời gian assert(time<=5) để kiểm tra xem hệ thống có đảm bảo thời gian từ khi có động đến khi báo chuông không vượt quá 5 giây không, sau đó ngừng phát chuông báo (sound = 0) và ngừng việc dùng đồng hồ để đo thời gian (set_time!-1) để bắt đầu quá trình mới.

 Tiến trình control: proctype control(){ byte k; bit b; bit f; end: do ::b==0 && f==0 -> end1: if :: control_sensor?breaker,k -> b=1; :: control_sensor?fire,k -> f=1; fi; ::b==1 -> atomic{inc!2;control_alarm! breaker; b=0}; ::f==1 -> atomic{inc!2; control_alarm!fire; f=0}; od }

Tiến trình control ngoài việc điều khiển nhận thông báo từ Sensors, gửi thông báo cho Alarm còn đảm nhiệm việc tăng thời gian cho mỗi hành động mất (adsbygoogle = window.adsbygoogle || []).push({});

thời gian qua kênh inc. Để tránh việc tăng thời gian song song, giả sử Control Panel xử lý thông tin mất 2 giây và việc xử lý là tuần tự.

 Và tiến trình init:

init {

atomic{

run environment();

run sensors(1); run sensors(2);

run sensors(3);run sensors(4);run sensors(5); run alarm();

run clock(); run control();

} }

Mô phỏng chương trình trên trong Xspin không có lỗi và được kết quả sau:

Hình 3.5: Kết quả khi mô phỏng mô hình hệ thống báo động, báo cháy mức trừu tượng

Sau khi chạy mô phỏng chương trình như trên, cần kiểm tra tính chất mà hệ thống phải thỏa mãn bằng việc chạy verify. Tính chất cần kiểm chứng của hệ thống báo động, báo cháy là: “bất cứ khi nào có động, hệ thống đều phải báo”. Biểu thức LTL mô tả tính chất này là [](move-><>sound). Và hệ thống cần đảm

bảo “thời gian từ khi có động đến khi chuông phát báo động không được vượt quá 5 giây”. Ràng buộc thời gian được thể hiện qua assert(time<=5).

Spin sẽ tự động sinh ra cấu trúc never claim khi thêm công thức LTL trên. Kết quả chạy verify cho thấy không có lỗi vi phạm do vậy hệ thống thỏa mãn tính chất cần kiểm tra.

Hình 3.6: Kết quả kiểm chứng mô hình hệ thống báo động, báo cháy

Phân tích kết quả trên thấy errors: 0 nên mô hình đưa ra thỏa mãn các thuộc tính đã nêu.

KẾT LUẬN

Như chúng ta thấy, với sự phát triển như vũ bão của Công nghệ thông tin, con người ngày càng phụ thuộc nhiều vào các ứng dụng của Công nghệ thông tin trong mọi lĩnh vực (như y tế, giáo dục, sản xuất,…). Các hệ thống này đòi hỏi sự chính xác cao để đảm bảo an toàn trong quá trình hoạt động. Do đó khi các hệ thống này được thiết kế cần được kiểm định kỹ càng trước khi vận hành để tránh gây thiệt hại. Từ đó đỏi hỏi cần phải có những kỹ thuật để kiểm định hệ thống nhằm đảm bảo hệ thống hoạt động đúng chức năng đặt ra.

Với mục tiêu ban đầu của đề tài: “Kiểm chứng tính đúng đắn hệ thống tính toán của chương trình bằng kiểm duyệt mô hình”, tác giả đã nghiên cứu về kỹ thuật kiểm duyệt mô hình (Model Checking), tìm hiểu về công cụ kiểm chứng Spin, ngôn ngữ mô hình hóa Promela, xây dựng tiến trình đồng hồ (clock), đồng thời đã xây dựng mô hình và kiểm duyệt cho hệ thống báo động, báo cháy, đến nay đã đạt được một số kết quả như sau:

 Nghiên cứu về kỹ thuật kiểm duyệt mô hình (Model Checking).

 Tìm hiểu về công cụ kiểm chứng Spin cũng như giao diện Xspin và ngôn ngữ mô hình hóa Promela.

 Xây dựng biến đồng hồ (time) và tiến trình đồng hồ (clock) để đo thời gian khi cần thiết, bằng cách này tác giả đã kết hợp tiến trình đồng hồ với kỹ thuật kiểm duyệt mô hình dành cho hệ thống không có ràng buộc thời gian để kiểm chứng hệ thống có ràng buộc thời gian.

 Xây dựng mô hình cho hệ thống báo động, báo cháy bằng ngôn ngữ Promela theo hướng chi tiết hóa dần (incremental).

 Sử dụng kỹ thuật kiểm duyệt mô hình kết hợp tiến trình đồng hồ xây dựng được để kiểm duyệt tính đúng đắn của hệ thống báo động, báo cháy sử dụng công cụ kiểm chứng Spin.

 Quá trình kiểm chứng tác giả đã đưa vào hệ thống 2 thuộc tính cần kiểm chứng là: “bất cứ khi nào có động, hệ thống đều phải báo” và “thời gian từ khi có động tới khi báo động không được vượt quá 5 giây”.

Về cơ bản luận văn đã đạt được những yêu cầu đặt ra. Tuy nhiên trong luận văn còn chưa thực hiện được việc mô hình hóa hệ thống báo động, báo cháy ở mức chi tiết nhất, và chương trình xây dựng được chưa có giao diện. Do đó hướng phát triển trong tương lai của luận văn cần:

 Mô hình hóa hệ thống báo động, báo cháy ở mức chi tiết hơn để hệ thống gần sát với hệ thống thực tế.

 Kiểm duyệt mọi trường hợp có thể của hệ thống để đảm bảo hệ thống hoạt động được đầy đủ chức năng.

 Nghiên cứu phương pháp kiểm tra tính đúng đắn của việc xây dựng mô hình từ mô tả của hệ thống.

 Xây dựng giao diện cho chương trình để thuận tiện khi làm việc với các chức năng. (adsbygoogle = window.adsbygoogle || []).push({});

TÀI LIỆU THAM KHẢO

1. Andrew Ireland, Distributed Systems Programming F21DS1, Department of Computer Science School of Mathematical and Computer Sciences Heriot Watt University Edinburgh.

2. Christel Baier Joost - pieter Katoen (2008), Principles of Model Checking, MIT Press Cambridge, Massachusetts London, England.

3. Gerard J. Holzmann (2003), The Spin Model Checker, Primer and Reference Manual, Addison Wesley Professional.

4. Kim Yong Chun and Dang Van Hung (2004), Verifying Real – Time Systems Using Untimed Model Checking Tools, The United Nations University, International Institute for Software Technology.

5. Dang Van Hung, Model - Checking and the SPIN Modelchecker, The United Nations University International Institute for Software Technology. 6. Mordechai Ben-Ari (2008), Principles of the Spin Model Checker, Springer

– Verlag London Limited, London.

7. Rajeev Alur (1991), Techniques for Automatic Verification of Real Time, A Dissertation Submitted to the Department of Computer Science and the Committee on Graduate Studies of Stanford University in Partial Fulfillment of the Rquirements for the degree of Doctor of Philosophy. 8. http://spinroot.com.

PHỤ LỤC

Phụ lục A: Mã nguồn mô hình hệ thống mức trừu tượng khi chạy verify trong Spin

mtype={fire,breaker};

chan control_sensor=[0] of {mtype,byte}; chan env=[0] of {mtype,byte};

chan control_alarm=[0] of {mtype}; show bit sound;

show bit move;

proctype environment() { show byte j=1; do ::j<=5 -> atomic{env!breaker,j;move=1;j=j+1}; :: j<=5 -> atomic{env!fire,j;move=1;j=j+1}; ::j>5-> break; od } proctype sensors(byte i) { end: do ::env?breaker,i->control_sensor! breaker,i; ::env?fire,i->control_sensor! fire,i; od } proctype alarm() { end: do ::control_alarm?breaker->sound=1; ::control_alarm?fire->sound=1; od } proctype control() { byte k; bit b; bit f; end: do ::b==0 && f==0 -> end1: if :: control_sensor?breaker,k -> b=1; :: control_sensor?fire,k -> f=1;

fi; ::b==1 -> atomic{control_alarm! breaker; b=0}; ::f==1 -> atomic{control_alarm!fire; f=0}; od } init { atomic{ run environment();

run sensors(1); run sensors(2);

run sensors(3);run sensors(4);run sensors(5); run alarm(); run control();

Một phần của tài liệu Kiểm chứng tính đúng đắn hệ thống tính toán của chương trình bằng kiểm duyệt mô hình (Trang 49)