BÁO CÁO THÍ NGHIỆM MÔN ĐO LƯỜNG VÀ ĐIỀU KHIỂN BẰNG MÁY TÍNH GVHD: TRẦN HOÀNG KHÔI NGUYÊN Nhóm 7 TP. HCM, tháng 7 năm 2020 Mục lục 1. BÀI 1: LẬP TRÌNH PLC S7 – 1200 – CÁC ỨNG DỤNG LẬP TRÌNH CƠ BẢN 2 1.1. Bài thí nghiệm 1: Khảo sát hoạt động của ngõ vào và ngõ ra 2 1.1.1. Bài thí nghiệm 1.1: Làm quen PLC và các nút bấm STARTSTOP 2 1.1.2. Thí nghiệm 1.2: Điều khiển hoạt động với các điều kiện ngõ vào khác nhau 4 1.2.2. Thí nghiệm 2.2: Viết chương trình phân loại sản phẩm với tín hiệu giả lập vừa tạo dựng được 10 2. BÀI 2 TRUYỀN THÔNG NỐI TIẾP PC VÀ PLC 15 2.1. Thí nghiệm 1: Làm quen với PLC S7200 15 2.1.1. Thí nghiệm 1.1: Thực hiện bài toán điều khiển đèn giao thông 15 2.1.2. Thí nghiệm 1.2: Cải tiến chương trình của thí nghiệm 1.1 hoạt động theo các chế độ khác nhau 19 2.2. Thí nghiệm 2: Giao tiếp giữa PC và PLC sử dụng ngắt nhận ký tự, truyền thông qua PORT0, giao thức “9600,N,8,1” 27 2.2.1. Thí nghiệm 2.1: Thực hiện Liên kết đơn giản giữa PLC và PC 27 2.2.2. Thí nghiệm 2.2: Thực hiện cải tiến bài toán điều khiển đèn giao thông của thí nghiệm 1.1 và quan sát trên giao diện 32 3. BÀI 3: GIAO TIẾP TCPIP 33 3.1. Bài thí nghiệm 1: Kết nối Modbus giữa PLC và PC 33 3.2. Bài thí nghiệm 2: Phát triển Thí nghiệm 1 ứng dụng điều khiển nhiệt độ 33 3.2.1. Điều khiển nhiệt độ bằng ONOFF 33 3.2.2. Điều khiển PID lò nhiệt 38 4. BÀI 4: LẬP TRÌNH GIAO TIẾP USB CARD GIAO TIẾP MÁY TÍNH 40 4.1. Thí nghiệm 1: Lập trình vi điều khiển sử dụng KeilC 40 4.2. Thí nghiệm 2: Lập trình giao diện C 40 4.3. Thí nghiệm 3: Điều khiển vị trí động cơ dùng thuật toán PID 63
BÀI 1: LẬP TRÌNH PLC S7 – 1200 – CÁC ỨNG DỤNG LẬP TRÌNH CƠ BẢN
Bài thí nghiệm 1: Khảo sát hoạt động của ngõ vào và ngõ ra
Hình 1.2 Cấu hình xung clock cho PLC(clock memory)
Hình 1.3 Chương trình nạp xuống PLC
Nhận xét: Chương trình hoạt động đúng với yêu cầu.
1.1.2 Thí nghiệm 1.2: Điều khiển hoạt động với các điều kiện ngõ vào khác nhau:
Yêu cầu: Điều khiển các đèn ngõ ra theo yêu điều kiện ngõ vào như sau:
- Default: 8 LED ngõ ra nhấp nháy chu kỳ 2s.
- Nhấn nút BT1, đèn LED sáng thứ tự từ trái sang phải, mỗi đèn sáng trong thời gian 1s
- Nhấn nút BT2, đèn LED sáng theo thứ tự từ phải sang trái, mỗi đèn sáng trong thời gian 0.5s
Hình 1.3 Chương trình nhấp nháy chu kì 2s
Hình 1.4 Sử dụng khối dịch bit trái khi nhấn nút BT1
Hình 1.5 Sử dụng khối dịch bit phải khi nhấn nút BT2
Khi đó so sánh giá trị của temp1, temp2 với các giá trị là (1 32767)
C_value = C_value - 65536; currentPos = C_value; textBox9.Text = currentPos.ToString() + ',' + pidOutput.ToString(); // calculate pid if (enablePID)
The PID control algorithm calculates the error by subtracting the current position from the setpoint, which is then used to determine the proportional part of the output The integral part accumulates the error over time, ensuring it remains within a defined range of -90 to 90 The derivative part assesses the rate of change of the error, contributing to the overall PID output Finally, the total PID output is constrained to a maximum of 90 and a minimum of -90 to maintain system stability.
// send cmd byte[] data_send = { 14, 78, 0, 0, DO_value[2], DO_value[3], DO_value[4],
DO_value[5], DO_value[6], DO_value[7], AO_0[0], AO_0[1], AO_1[0], AO_1[1], reC0 }; try
{ pidOutput = -pidOutput; data_send[2] = (byte)pidOutput;
} writer.Write(data_send, 1000, out bytesWritten);
MessageBox.Show("Can Not Send Data To USB Device\nDetails: " + err,
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
AI_2_value[0] = input[16]; ai_0_value = BitConverter.ToInt32(AI_0_value, 0); ai_1_value = BitConverter.ToInt32(AI_1_value, 0); ai_2_value = BitConverter.ToInt32(AI_2_value, 0);
AI_0_VALUE = (Convert.ToDouble(ai_0_value) / 4095)*3.3;
AI_1_VALUE = (Convert.ToDouble(ai_1_value) / 4095)*3.3;
AI_2_VALUE = (Convert.ToDouble(ai_2_value) / (gain1 * 131072)) * 2.048; /****************************************/
#region DI if (Convert.ToBoolean(DI_value & 0x01))
{ oval_DI_1.FillColor = Color.Red;
{ oval_DI_1.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 1 & 0x01))
{ oval_DI_2.FillColor = Color.Red;
{ oval_DI_2.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 2 & 0x01))
{ oval_DI_3.FillColor = Color.Red;
{ oval_DI_3.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 3 & 0x01))
{ oval_DI_4.FillColor = Color.Red;
{ oval_DI_4.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 4 & 0x01))
{ oval_DI_5.FillColor = Color.Red;
{ oval_DI_5.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 5 & 0x01)) { oval_DI_6.FillColor = Color.Red;
{ oval_DI_6.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 6 & 0x01)) { oval_DI_7.FillColor = Color.Red;
{ oval_DI_7.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 7 & 0x01)) { oval_DI_8.FillColor = Color.Red;
{ oval_DI_4.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 4 & 0x01)) { oval_DI_5.FillColor = Color.Red;
{ oval_DI_5.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 5 & 0x01)) { oval_DI_6.FillColor = Color.Red;
{ oval_DI_6.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 6 & 0x01)) { oval_DI_7.FillColor = Color.Red;
{ oval_DI_7.FillColor = Color.White;
// if (Convert.ToBoolean(DI_value >> 7 & 0x01))
{ oval_DI_8.FillColor = Color.Red;
{ Đoạn chương trình tính PID, màu sắc cho các ovalshape, hiện thị value trên textbox AI0 - AI2
Thay đổi giá trị AI0 (bằng cách chỉnh biến trở VR1), cho quay động cơvới PWM = 30%
Nhận xét: Thời gian lấy mẫu tăng tốc độ thay đổi AIN chậm dần.
Thay đổi thời gian lấy mẫu lần lượt là 1000ms, 10ms
Ban đầu cho Ki và Kd bằng 0 Chỉnh Kp tăng dần đến khi đáp ứng dao động tuần hoàn quanh giá trị mong muốn.
Đặt Ki bằng với chu kỳ dao động.
Điều chỉnh Kp lại cho phù hợp
Nếu có vọt lố thì điều chỉnh giá trị