Mạch in thành phẩm

Một phần của tài liệu Xây dựng hệ thống quản lý cân động ứng dụng trong hệ thống cân tàu hỏa (Trang 43 - 55)

B Ứng dụng mạch khuếch đại thuật toán

3.20Mạch in thành phẩm

Phần mềm nhúng được lập trình trên nền vi điều khiển họ PIC, đoạn mã nguồn có thể như sau:

Mã nguồn của đoạn chương trình đọc ADC:

unsigned int ReadADC(unsigned char ch){ unsigned int value=0;

setup_adc( ADC_CLOCK_INTERNAL ); setup_adc_ports( ALL_ANALOG ); set_adc_channel(ch); value = read_adc(); return value; }

3.2 Thiết kế hướng đối tượng phần mềm hệ thống [2] 41

unsigned short m, k;

unsigned short userRD_buffer[64]; unsigned short userWR_buffer[64]; void interrupt() {

asm CALL _Hid_InterruptProc asm nop

}

void Init_Main() {

// Disable all interrupts

// Disable GIE, PEIE, TMR0IE, INT0IE,RBIE INTCON = 0;

INTCON2 = 0xF5; INTCON3 = 0xC0;

// Disable Priority Levels on interrupts RCON.IPEN = 0;

PIE1 = 0; PIE2 = 0; PIR1 = 0; PIR2 = 0;

// Configure all ports with analog function as digital ADCON1 |= 0x0F; // Ports Configuration TRISA = 0; TRISB = 0; TRISC = 0xFF; TRISD = 0xFF; TRISE = 0x07; LATA = 0; LATB = 0; LATC = 0; LATD = 0; LATE = 0;

// Clear user RAM

// Banks [00 .. 07] ( 8 x 256 = 2048 Bytes ) asm { LFSR FSR0, 0x000 MOVLW 0x08 CLRF POSTINC0, 0 CPFSEQ FSR0H, 0 BRA $ - 2 } // Timer 0 T0CON = 0x07; TMR0H = (65536-156) >> 8; TMR0L = (65536-156) & 0xFF;

INTCON.T0IE = 1; // Enable T0IE T0CON.TMR0ON = 1;

}

/** Main Program Routine **/ void main() {

Init_Main();

Hid_Enable(&userRD_buffer, &userWR_buffer); do {

3.2 Thiết kế hướng đối tượng phần mềm hệ thống [2] 42

userWR_buffer[0] = k; // Send the number via USB Hid_Write(&userWR_buffer, 1); }

} while (1); Hid_Disable(); }

Mã nguồn đoạn chương trình hiển thị LED 7 thanh:

// Display Buffer array to LED void LED7Display(){ const int8 L7[12]={ 0x88,0xEB,0x4C,0x49,0x2B,0x19,0x18,0xCB,0x8,0x9,0x7F,0xFF }; #define black 11 #define negative 10

#define clock {output_bit(SH_CP,0);output_bit(SH_CP,1);} #define out1bit output_bit(DI,buffer[k]&1);

#define ST_CP PIN_B2 #define SH_CP PIN_B1 #define DI PIN_B0 int8 k,k1,so0; buffer[7]=L7[(W /1000)%10]; buffer[6]=L7[(W / 100)%10]; buffer[5]=L7[(W / 10)%10]; buffer[4]=L7[(W )%10]; buffer[3]=L7[(SP/1000)%10]; buffer[2]=L7[(SP/ 100)%10]; buffer[1]=L7[(SP/ 10)%10]; buffer[0]=L7[(SP )%10]; so0=1; if((buffer[7]==L7[0])&&(so0)){buffer[7]=L7[black];}else so0=0; if((buffer[6]==L7[0])&&(so0)){buffer[6]=L7[black];}else so0=0; if((buffer[5]==L7[0])&&(so0)){buffer[5]=L7[black];} so0=1; if((buffer[3]==L7[0])&&(so0)){buffer[3]=L7[black];}else so0=0; if((buffer[2]==L7[0])&&(so0)){buffer[2]=L7[black];}else so0=0; if((buffer[1]==L7[0])&&(so0)){buffer[1]=L7[black];} for(k=0;k<8;k++){ for(k1=0;k1<8;k1++){

out1bit clock buffer[k]>>=1; }} (adsbygoogle = window.adsbygoogle || []).push({});

output_bit(ST_CP,0); output_bit(ST_CP,1); }

Đoạn mã nguồn nhận dữ liệu trên PC:

private void COM1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) {

3.2 Thiết kế hướng đối tượng phần mềm hệ thống [2] 43 { startByte = COM1.ReadByte(); str = COM1.ReadTo("\n").ToString(); //startByte = Convert.ToSByte(str.Substring(0, 1)); DAT[dau] = str;

if (++dau > Nmax) dau = 0; blink = !blink;

}

catch { } }

Đoạn chương trình xác định khối lượng toa tàu và lưu dữ liệu lên file:

private void timer1_Tick(object sender, EventArgs e) { com_data_receiv.Visible = blink; if (mathe != "") { mathe_lst.Items.Insert(0,mathe.Substring (0,mathe.Length -1)); mathe = ""; } if (cuoi != dau) {

while (cuoi != dau) {

if (DAT[cuoi].Length >7) {

A_old = A; B_old = B;

Conv(DAT[cuoi], out A, out B);

A += Convert.ToInt32(Zero1_txt.Text); B += Convert.ToInt32(Zero2_txt.Text); Can1_disp.Text = A.ToString(); Can2_disp.Text = B.ToString(); if (A > 30000) A = A_old; if (B > 30000) B = B_old; //--- switch (startByte) { case 1: // data TrongTruc_old1 = TrongTruc1; TrongTruc_old2 = TrongTruc2; vuotnguong_buf1[vuotnguong_buf1_cnt] = A > Convert.ToUInt16(NguongKohang_txt.Text); if (Huongtau_lbl.Text.Equals("Từ ga đi")) vuotnguong_buf1[vuotnguong_buf1_cnt] = A > Convert.ToUInt16(NguongCoHang_txt.Text); vuotnguong_buf2[vuotnguong_buf2_cnt] = B > Convert.ToUInt16(NguongKohang_txt.Text); if (Huongtau_lbl.Text.Equals("Từ ga đi")) vuotnguong_buf2[vuotnguong_buf2_cnt] = B > Convert.ToUInt16(NguongCoHang_txt.Text);

3.2 Thiết kế hướng đối tượng phần mềm hệ thống [2] 44

if (vuotnguong_buf1[k] == false) { VuotNguong1 = false; break; }

vuotnguong_buf1_cnt++;

if (vuotnguong_buf1_cnt > 4) vuotnguong_buf1_cnt = 0; VuotNguong2 = true;

for (byte k = 0; k < 5; k++) if (vuotnguong_buf2[k] == false)

{ VuotNguong2 = false; break; }

vuotnguong_buf2_cnt++; if (vuotnguong_buf2_cnt > 4) vuotnguong_buf2_cnt = 0; if (VuotNguong1) { DAT_ILDE_cnt1 = 10; dat_cnt = Convert.ToInt64(Tauquahan_txt.Text); if (Huongtau_lbl.Text == "") { Huongtau_lbl.Text = "Từ ga đi"; huongtau_muiten.Text = "-->>"; DB_di.Rows.Clear(); } } if (VuotNguong2) { DAT_ILDE_cnt2 = 10; dat_cnt = Convert.ToInt64(Tauquahan_txt.Text); if (Huongtau_lbl.Text == "") {

Huongtau_lbl.Text = "Đi về ga"; huongtau_muiten.Text = "<<--"; DB_ve.Rows.Clear(); } } if (DAT_ILDE_cnt1 > 0) DAT_ILDE_cnt1--; if (DAT_ILDE_cnt2 > 0) DAT_ILDE_cnt2--; //Tàu ngoài cân, xóa hướng tàu,

//xóa bộ đệm của mỗi toa:

if (dat_cnt > 0) { dat_cnt--; DBtemp.Rows.Add(); DBtemp.Rows[DBtemp.RowCount - 1].Cells[0].Value = A; DBtemp.Rows[DBtemp.RowCount - 1].Cells[1].Value = B; DBtemp.Rows[DBtemp.RowCount - 1].Cells[2].Value = DateTime.Now ; Disp1[Disp1_cuoi++] = A; if (Disp1_cuoi > Disp_max) Disp1_cuoi = 0;

Disp2[Disp2_cuoi++] = B; if (Disp2_cuoi > Disp_max) Disp2_cuoi = 0;

TongSomau.Text = DBtemp.RowCount.ToString (); }

if (dat_cnt == 0) Huongtau_lbl.Text = ""; // Ngoài đoàn tàu:

3.2 Thiết kế hướng đối tượng phần mềm hệ thống [2] 45

{

OleDbConnection cnn = new OleDbConnection(strConn); cnn.Open(); (adsbygoogle = window.adsbygoogle || []).push({});

OleDbCommand cmd = new OleDbCommand(strSQL, cnn); TAfunctions ta = new TAfunctions();

if(Cumcan1_opt.Checked ) Caculate(0);// tính cụm 0=A, 1=B else Caculate(1);// tính cụm 0=A, 1=B // lưu vào CSDL: //Tinh_btn_Click(sender,e);

//FileStream fs = new FileStream(); MaxValue_cnt = MaxValue("‘Lần cân thứ‘", "TrainTime");

string filename= "DAT" + DateTime.Today.Year.ToString() +

DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() +

DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString();

string SQL = "Create table " + filename + " (Cum1 Integer ,Cum2 Integer , Thoigian datetime)";

cmd.CommandText = SQL; cmd.ExecuteNonQuery();

for (int r = 0; r < DBtemp.RowCount; r++) {

SQL = "INSERT INTO " + filename + " (Cum1,Cum2,Thoigian) VALUES (" + (DBtemp.Rows[r].Cells[0].Value) + "," + (DBtemp.Rows[r].Cells[1].Value) + ",’" + DBtemp.Rows[r].Cells[2].Value + "’)"; cmd.CommandText = SQL; cmd.ExecuteNonQuery(); }

for (int r = 0; r < DB_di.RowCount-1; r++) {

try {

SQL = "INSERT INTO TrainData_tien (STT,‘Lần cân thứ‘, ‘Mã toa‘,‘Tốc độ (Km/h)‘,‘KL Tổng (Kg)‘) VALUES (" + DB_di.Rows[r].Cells["STT"].Value + "," + MaxValue_cnt + ",’" + DB_di.Rows[r].Cells["Mã toa"].Value + "’," + DB_di.Rows[r].Cells["Tốc độ (Km/h)"].Value + "," + DB_di.Rows[r].Cells["KL Tổng (Kg)"].Value + ")"; cmd.CommandText = SQL; cmd.ExecuteNonQuery(); } catch {

3.2 Thiết kế hướng đối tượng phần mềm hệ thống [2] 46

for (int r = 0; r < DB_ve.RowCount-1; r++) {

try {

SQL = "INSERT INTO TrainData_lui (STT,‘Lần cân thứ‘, ‘Mã toa‘,‘Tốc độ (Km/h)‘,‘KL Tổng (Kg)‘) VALUES (" + DB_ve.Rows[r].Cells["STT"].Value + "," + MaxValue_cnt + ",’" + DB_ve.Rows[r].Cells["Mã toa"].Value + "’," + DB_ve.Rows[r].Cells["Tốc độ (Km/h)"].Value + "," + DB_ve.Rows[r].Cells["KL Tổng (Kg)"].Value + ")"; cmd.CommandText = SQL; cmd.ExecuteNonQuery(); } catch { } }

SQL = "INSERT INTO TrainTime (" + "‘Lần cân thứ‘,‘Hướng tàu‘," + "‘Thời gian‘,‘Số hiệu đoàn tàu‘," +

"‘KL Tổng(Kg)‘,‘Tên file dữ liệu gốc‘)VALUES (" + MaxValue_cnt + ",’" + Huongtau_lbl.Text + "’,’" + System.DateTime.Now + "’,’" + Sohieudoantau_txt.Text + "’,’" + KLTong_txt.Text + "’,’" + filename + "’)"; cmd.CommandText = SQL; cmd.ExecuteNonQuery(); cnn.Close(); VuotNguong1 = false; VuotNguong2 = false; } //--- Tauqua_lbl.Text = dat_cnt.ToString(); break; case 2: Tocdo_lbl.Text = Convert.ToString(Convert.ToSingle(A)/1000); if (B == 11) { Huongtau_lbl.Text = "Từ ga đi"; huongtau_muiten.Text = "==>>"; } if (B == 10) {

Huongtau_lbl.Text = "Đi về ga"; huongtau_muiten.Text = "<<=="; }

break;

3.3 Tổng kết chương 47

// label19.Text = "Đầu tàu=11"; break;

case 4: break; }

}

if (++cuoi > Nmax) cuoi = 0; }

} }

3.2.5 Vận hành và bảo trì hệ thống

Hệ thống bao gồm cả phần cứng và phần mềm, do vậy, khi thiết kế cần phải xác định rõ thời gian hệ thống hoạ động ổn định nhất để có phương án bảo hành bải trì.

Trong sau khi thiết kế, hệ thống đã được kiểm thử tại công ty than Vàng danh Uông bí, Quảng ninh. (adsbygoogle = window.adsbygoogle || []).push({});

Các mẫu thử khi có tàu chạy qua khá ổn, gần như không có nhiễu, dữ

liệu hoàn toàn như mong đợi. Nhìn các hình của mẫu (hình4.4, 4.5, hình

4.6, hình 4.8) chúng ta có thể thấy rõ từng mẫu tín hiệu được gửi về.

3.3 Tổng kết chương

Chương này thiết kế chi tiết cả phần cứng và phần mềm.

Về phần cứng, thiết kế được chi tiết các thành phần của từng module, các tín hiệu đầu vào, đầu ra theo đúng như yêu cầu trong phần thiết kế tổng thể, đảm bảo các module có thể hoạt động tốt trong phạm vi thiết kế và có thể ghép nối giao tiếp với nhau an toàn.

Về phần mềm nhúng, đưa ra được các module dùng để kiểm tra sự hoạt động độc lập từng module và module phần mềm dùng trong quá trình vận hành hệ thống thực tế.

Về phần mềm, đã thiết kế đạt yêu cầu, phân tích phần mềm hướng đối tượng, phân tích từng quá trình, để lập trình viên dễ dàng hình dung được sự vận hành của toàn bộ hệ thống, quá trình gia lệnh điều khiển, cũng như luồng dữ liệu.

Chương 4

Xây dựng hệ thống cân động vật thể

Giới thiệu về môi trường các ngôn ngữ lập trình:

• Firmware

• Software

Thiết kế chương trình, giao diện chức năng và một số mẫu dữ liệu thực tế thu thập được.

4.1 Giới thiệu về ngôn ngữ lập trình cho phần cứng nhúng

Phần cứng đơn thuần, chỉ hoạt động theo thiết kế cố định ban đầu, nó không thể linh động, không thể thay đổi các thông số, không thể đáp ứng được các bài toán cần truyền thông theo quy chuẩn và không thể áp dụng các thuật toán,...

Qua đó, để khắc phục được những nhược điểm trên chúng ta dùng phần nhúng. Hệ thống nhúng là hệ thống có phần mềm nhúng trong phần cứng. Có rất nhiều phần cứng hỗ trợ hệ nhúng, ví dụ: thông dụng như Hệ vi điều khiển onchip 8051, PIC, AVR, ARM, PSoC, DSP,...

Mỗi nền phần cứng nhúng, sẽ đi kèm là một trình biên dịch, hỗ trợ ngôn ngữ ASM và một số ngôn ngữ bậc cao khác. Trong hệ thống của chúng ta, để thuận tiện, ta lập trình cho hệ nhúng bằng ngôn ngữ C. Ngôn ngữ C là ngôn ngữ lập trình bậc cao, đã hỗ trợ hầu hết các chương trình con thông dụng, có cấu trúc rõ ràng, mạch lạc, dễ hiểu và dễ lập trình.

4.2 Giới thiệu về ngôn ngữ lập trình phần mềm: C# 49

Trong số các chương trình dịch C cho vi điều khiển, cũng có nhiều loại (dị bản) C khác nhau, không tuân thủ thống nhất là dùng ANSI C, vậy nên có đôi điều chúng ta cần phải nói đến. Ngôn ngữ C cho PIC được CCS phát triển, dựa trên nền tảng C, nhưng các phương pháp vào/ra, thay vì dùng thẳng các thanh ghi thì CCS lại sử dụng hàm. Ví dụ, để xuất giá trị ra cổng RB, High-Tech (ngôn ngữ C theo chuẩn ANSI C) viết lệnh là: PORTB=value; (với value là giá trị cần xuất); thì trong CCS lại sử dụng hàm: output_ B(value);

Thay vì sử dụng các thanh ghi làm phương pháp vào/ra, CCS chuyển hết thành dùng hàm như vậy, đôi khi cũng khó hiểu cho người mới tiếp cận; song lại là một phương pháp viết lệnh tốt khi chúng ta cần chuyển đổi chương trình dịch vì một lý do nào đó.

CCS là một hãng phát triển C cho PIC khá toàn diện, luôn cập nhật, hỗ trợ những dòng vi điều khiển mới, làm cho người lập trình dễ dàng tiếp cận với các vi điều khiển mới mà không gặp chút khó khăn nào; CCS dùng phương pháp lập trình tương đồng cho các dòng vi điều khiển khác nhau, chính vì vậy mà khi muốn thay đổi phần cứng thì phần mềm không phải thay đổi nhiều.

Vì là lập trình C, nên CCS cũng hỗ trợ hầu hết các cấu trúc của C, như khai báo biến, các toán tử, các phương pháp thực hiện biểu thức, cấu trúc lặp, rẽ nhánh, con trỏ,... vậy nên, ta có thể dùng các kỹ năng lập trình C cho phần mềm máy tính để lập trình cho hệ vi điều khiển.

Khi lập trình xong, ta có thể dịch ra mã *.Hex (một mã dạng mã máy, nhưng là chuẩn để nạp vào PIC), sau đó dùng một chương trình mô phỏng để mô phỏng lại hoạt động của hệ thống, cụ thể là lập trình cho PIC, sau đó, nạp mã Hex đó vào phần cứng, kiểm thử xem hệ thống hoạt động ổn chưa, nếu chưa thực sự ổn so với mong đợi, có thể sửa mã nguồn, dịch rồi nạp lại.

4.2 Giới thiệu về ngôn ngữ lập trình phần mềm: C#

Ngôn ngữ C# khá đơn giản, chỉ khoảng 80 từ khóa và hơn mười mấy kiểu dữ liệu được xây dựng sẵn. Tuy nhiên, ngôn ngữ C# có ý nghĩa cao khi nó thực thi những khái niệm lập trình hiện đại. C# bao gồm tất cả những hỗ trợ cho cấu trúc, thành phần component, lập trình hướng đối

4.2 Giới thiệu về ngôn ngữ lập trình phần mềm: C# 50

tượng. Những tính chất đó hiện diện trong một ngôn ngữ lập trình hiện đại. Và ngôn ngữ C# hội đủ những điều kiện như vậy, hơn nữa nó được xây dựng trên nền tảng của hai ngôn ngữ mạnh nhất là C++ và Java.

Ngôn ngữ C# được phát triển bởi đội ngũ kỹ sư của Microsoft, trong đó người dẫn đầu là Anders Hejlsberg và Scott Wiltamuth. Cả hai người này điều là những người nổi tiếng, trong đó Anders Hejlsberg được biết đến là tác giả của Turbo Pascal, một ngôn ngữ lập trình PC phổ biến. Và ông đứng đầu nhóm thiết kế Borland Delphi, một trong những thành công đầu tiên của việc xây dựng môi trường phát triển tích hợp (IDE) cho lập trình client/server. Phần cốt lõi hay còn gọi là trái tim của bất cứ ngôn ngữ lập trình hướng đối tượng là sự hỗ trợ của nó cho việc định nghĩa và làm việc với những lớp. Những lớp thì định nghĩa những kiểu dữ liệu mới, cho phép người phát triển mở rộng ngôn ngữ để tạo mô hình tốt hơn để giải quyết vấn đề. Ngôn ngữ C# chứa những từ khóa cho việc khai báo những kiểu lớp đối tượng mới và những phương thức hay thuộc tính của lớp, và cho việc thực thi đóng gói, kế thừa, và đa hình, ba thuộc tính cơ bản của bất cứ ngôn ngữ lập trình hướng đối tượng. Trong ngôn ngữ C# mọi thứ liên quan đến khai báo lớp điều được tìm thấy trong phần khai báo của nó. Định nghĩa một lớp trong ngôn ngữ C# không đòi hỏi phải chia ra tập tin header và tập tin nguồn giống như trong ngôn ngữ C++. Hơn thế nữa, ngôn ngữ C# hỗ trợ kiểu XML, cho phép chèn các tag XML để phát sinh tự động các document cho lớp.

C# cũng hỗ trợ giao diện interface, nó được xem như một cam kết với một lớp cho những dịch vụ mà giao diện quy định. Trong ngôn ngữ C#, một lớp chỉ có thể kế thừa từ duy nhất một lớp cha, tức là không cho đa kế thừa như trong ngôn ngữ C++, tuy nhiên một lớp có thể thực thi nhiều giao diện. Khi một lớp thực thi một giao diện thì nó sẽ hứa là nó sẽ cung cấp chức năng thực thi giao diện. Trong ngôn ngữ C#, những cấu trúc cũng được hỗ trợ, nhưng khái niệm về ngữ nghĩa của nó thay đổi khác với C++. Trong C#, một cấu trúc được giới hạn, là kiểu dữ liệu nhỏ gọn, và khi tạo thể hiện thì nó yêu cầu ít hơn về hệ điều hành và bộ nhớ so với một lớp. Một cấu trúc thì không thể kế thừa từ một lớp hay được kế thừa nhưng một cấu trúc có thể thực thi một giao diện. Ngôn ngữ C# cung cấp những đặc tính hướng thành phần (component-oriented), như là những thuộc tính, những sự kiện. Lập trình hướng thành phần được hỗ trợ bởi CLR cho phép lưu trữ metadata với mã nguồn cho một lớp. Metadata mô tả cho một lớp, bao gồm những phương thức và những thuộc tính của nó, cũng như những (adsbygoogle = window.adsbygoogle || []).push({});

4.3 Các chức năng của chương trình 51

sự bảo mật cần thiết và những thuộc tính khác. Mã nguồn chứa đựng những logic cần thiết để thực hiện những chức năng của nó.. Do vậy, một lớp được biên dịch như là một khối self-contained, nên môi trường hosting biết được cách đọc metadata của một lớp và mã nguồn cần thiết mà không cần những thông tin khác để sử dụng nó. Một lưu ý cuối cùng về ngôn ngữ C# là ngôn ngữ này cũng hỗ trợ việc truy cập bộ nhớ trực tiếp sử dụng kiểu con trỏ của C++ và từ khóa cho dấu ngoặc [] trong toán tử. Các mã nguồn này là không an toàn (unsafe). Và bộ giải phóng bộ nhớ tự động của CLR sẽ không thực hiện việc giải phóng những đối tượng được tham chiếu bằng sử dụng con trỏ cho đến khi chúng được giải phóng.

Tại sao phải sử dụng ngôn ngữ C#

Nhiều người tin rằng không cần thiết có một ngôn ngữ lập trình mới. Java, C++, Perl, Microsoft Visual Basic, và những ngôn ngữ khác được nghĩ rằng đã cung cấp tất cả những chức năng cần thiết. Ngôn ngữ C# là một ngôn ngữ được dẫn xuất từ C và C++, nhưng nó được tạo từ nền tảng phát triển hơn. Microsoft bắt đầu với công việc trong C và C++ và thêm vào những đặc tính mới để làm cho ngôn ngữ này dễ sử dụng hơn. Nhiều trong số những đặc tính này khá giống với những đặc tính có trong ngôn ngữ Java. Không dừng lại ở đó, Microsoft đưa ra một số mục đích khi xây dựng ngôn ngữ này.

4.3 Các chức năng của chương trình

Một phần của tài liệu Xây dựng hệ thống quản lý cân động ứng dụng trong hệ thống cân tàu hỏa (Trang 43 - 55)