You are on page 1of 10

(Ngày ra đề) (Ngày duyệt đề)

Giảng viên ra đề: Người phê duyệt:


(Chữ ký và Họ tên) (Chữ ký, Chức vụ và Họ tên)

(phần phía trên cần che đi khi in sao đề thi)

Học kỳ/năm học 2 2019-2020


THI CUỐI KỲ Ngày thi 20/7/2020
Môn học Đo lường điều khiển bằng máy tính
TRƯỜNG ĐH BÁCH KHOA – ĐHQG-HCM Mã môn học EE3017
KHOA ĐIỆN – ĐIỆN TỬ………………….
Thời lượng 90 phút Mã đề
Ghi - Được sử dụng tài liệu
chú: - Được sử dụng viết chì để vẽ hình

ĐÁP ÁN
Câu 1 (L.O.2) (3đ): Viết chương trình PLC S7-1200 đèn giao thông cho người đi bộ qua đường, ban đầu đèn xanh
xe D_XX và đèn đỏ bộ D_DB sáng, đèn báo ghi nhận D_L1 tắt với các yêu cầu sau:
a. Thực hiện yêu cầu điều khiển:
B1: Khi nhấn nút yêu cầu bộ hành B_B1 đèn D_L1 sáng báo đã ghi nhận, không tiếp nhận nút nữa,
B2: Nếu thời gian đèn xanh xe D_XX sáng nhiều hơn 30s, thì Đèn vàng xe D_VX sáng trong 3s,
B3: Đèn đỏ xe D_DX sáng, đèn xanh đi bộ D_XB sáng 10s, sau đó nhấp nháy 5 lần chu kỳ 1s rồi tắt, đèn xanh xe
D_XX và đèn đỏ bộ D_DB sáng, đèn D_L1 tắt.
b. (LO6) Hiển thị thời gian còn lại của đèn đỏ xe với 2 đèn 7 đoạn (Sinh viên có thể lưa chọn phương pháp
dùng IC giải mã 7 đoạn ghép nối với ngõ ra PLC, hoặc thực hiện giải mã 7 đoạn trên PLC, vẽ mạch ghép
nối)
//Mã BCD 2 số xuất ra QB1, nối vào 2 IC bcd-7segment, rồi ra 2 đèn 7 segment, cần chú tý điện áp 24v từ PLC và
5V của IC

Câu 2 (4đ):

a. (LO4) (1.5đ) – gợi ý mạch thiết kế giải mã cho yêu cầu của đề bài sử dụng atmega8 – Kênh Analog
10bit sử dụng trực tiếp ADC của chip VXL
U1 U3
9 22 /DI_CS D0 2 3 DI0
RESET PC0/SCL Q0 D0
23 DO_CS D1 5 4 DI1
PC1/SDA Q1 D1
13 24 DA_CS D2 6 7 DI2
XTAL1 PC2/TCK Q2 D2
12 25 D3 9 8 DI3
XTAL2 PC3/TMS Q3 D3
26 D4 12 13 DI4
PC4/TDO Q4 D4
AI 40 27 D5 15 14 DI5
PA0/ADC0 PC5/TDI Q5 D5
39 28 D6 16 17 DI6
PA1/ADC1 PC6/TOSC1 Q6 D6
38 29 D7 19 18 DI7
PA2/ADC2 PC7/TOSC2 Q7 D7
37
PA3/ADC3
36 14 Rx 1 /DI_CS
PA4/ADC4 PD0/RXD OE
35 15 Tx 11
PA5/ADC5 PD1/TXD LE
DA8 34 16
PA6/ADC6 PD2/INT0
DA9 33 17 74LS373
PA7/ADC7 PD3/INT1
18
PD4/OC1B
D0 1 19
PB0/T0/XCK PD5/OC1A
D1 2 20
PB1/T1 PD6/ICP1
D2 3 21
PB2/AIN0/INT2 PD7/OC2 U4
D3 4
PB3/AIN1/OC0
D4 5 D0 3 2 DO0
PB4/SS D0 Q0
D5 6 D1 4 5 DO1
PB5/MOSI D1 Q1
D6 7 32 D2 7 6 DO2
PB6/MISO AREF D2 Q2
D7 8 30 D3 8 9 DO3
PB7/SCK AVCC D3 Q3
D4 13 12 DO4
D4 Q4
ATMEGA16 D5 14 15 DO5
D5 Q5
D6 17 16 DO6
D6 Q6
D7 18 19 DO7
D7 Q7
1
OE
DO_CS 11
U2 LE
1 16 74LS373
IOUT1 RFEEDBACK
2 15
IOUT2 VREF IN
3 14
GND V+
DA0 4 13 DA9
A1 A10
DA1 5 12 DA8
A2 A9 U5
DA2 6 11 DA7
A3 A8
DA3 7 10 DA6 D0 3 2 DA0
A4 A7 D0 Q0
DA4 8 9 DA5 D1 4 5 DA1
A5 A6 D1 Q1
D2 7 6 DA2
D2 Q2
DAC102X D3 8 9 DA3
D3 Q3
D4 13 12 DA4
D4 Q4
D5 14 15 DA5
D5 Q5
D6 17 16 DA6
D6 Q6
D7 18 19 DA7
D7 Q7
1
OE
DA_CS 11
LE
74LS373
b. (LO2)(1đ)Chương trình C#

Đoạn chương trình gởi dữ liệu DAC

private void btn_SendDAC_Click(object sender, EventArgs e)


{
byte[] STX = {0x02};
serialPort1.Write(STX, 0, 1);
serialPort1.WriteLine("," + "DAC" +","+ txtBox_DAC.Text);
}

Đoạn chương trình nhận dữ liệu ADC

private void serialPort1_DataReceived(object sender,


System.IO.Ports.SerialDataReceivedEventArgs e)
{
string read_data = serialPort1.ReadLine();
string[] sub_data = read_data.Split(',');
byte[] STX = ASCIIEncoding.ASCII.GetBytes(sub_data[0]);
if ((STX[0] == 2) & (sub_data[1] == "ADC"))
{
textBox2.Text = sub_data[2];
}

c. (LO2)(1.5đ)Đoạn chương trình firmware

Code đoan chương trình con đọc và gởi tín hiệu ADC

void ADC_read()

float ADC_Voltage = read_adc(0)*10.0/1024.0;

printf("%c,ADC,%2.2f \r\n",2,ADC_Voltage);

Đoạn chương trình con xử lý tín hiệu DAC từ máy tính

void DAC_process()

float DAC_Voltage;

int DAC_Value;

char DAC_data[5];

if ((rx_data[0]==2) && (rx_data[2]=='D')&& (rx_data[3]=='A')&& (rx_data[4]=='C'))

strncpy(DAC_data,rx_data+6,4);

DAC_Voltage =atof(DAC_data);
DAC_Value = DAC_Voltage*1023/9.99;

printf("%s %d",DAC_data,DAC_Value);

PORTB = DAC_Value & 0x00FF;

PORTA = (DAC_Value & 0x0300)>>2;

PORTC.2 = 1;

PORTC.2 = 0;

Câu 3 (LO2)(3đ): Viết chương trình Modbus TCP giữa hai PLC S7-1200, PLC1 Modbus Server và PLC2 Modbus
Client. PLC2 đọc 4 ô nhớ địa chỉ bắt đầu MD10 (real) của PLC1 và lưu vào khối DB của PLC2, giải thích vắn tắt
các lệnh và thông số
//PLC SERVER

//Thông số kết nối

//Khối dữ liệu được Client đọc


//Chương trình Server

//Minh họa sự thay đổi ô nhớ MD10 (Real)

//Move MD10, MD14..MD22 vào khối DB DBSERVER


//PLC CLIENT

//Thông số kết nối của MB_CLIENT

//Dữ liệu từ Server 8 word lưu vào DBCLIENT của Client


//Khối DB DATA của Client là array 6 số thực

//Chuyển 2 word nhận được từ DBCLIENT.DATA ra số thực lưu vào khối DATA của PLC2, có 4 số thực
//Monitor Server và Client
Câu 5:

a. (2đ) Tạo FB hoặc FC thực hiện bộ điều khiển PID như sau:

Đoạn chương trình SCL thực hiện thuật toán PID như sau:

#uk := #uk_1 + #Kp * (#ek - #ek_1) + #Ki * #Ts * (#ek + #ek_1) + #Kd * (#ek - 2 * #ek_1 + #ek_2) / #Ts;

#uk_1 := #uk;

#ek_2 := #ek_1;

#ek_1 := #ek;

b. (2đ) Đoạn chương trình C# cập nhật thông số:

private void btn_PID_Update_Click(object sender, EventArgs e)

double Kp = double.Parse(txt_Kp.Text);

double Ki = double.Parse(txt_Ki.Text);

double Kd = double.Parse(txt_Kd.Text);

int[] Kp_register = ModbusClient.ConvertDoubleToRegisters(Kp,ModbusClient.RegisterOrder.HighLow);

int[] Ki_register = ModbusClient.ConvertDoubleToRegisters(Ki, ModbusClient.RegisterOrder.HighLow);

int[] Kd_register = ModbusClient.ConvertDoubleToRegisters(Kd, ModbusClient.RegisterOrder.HighLow);

modbusClient.WriteMultipleRegisters(0, Kp_register);

modbusClient.WriteMultipleRegisters(2, Ki_register);

modbusClient.WriteMultipleRegisters(4, Kd_register);

You might also like