Thursday, October 29, 2015

Xuất dữ liệu quá trình ra file csv để mở trong excel sử dụng C-Script trong WinCC

Bài này trình bày chi tiết cách dùng C-Script để xuất dữ liệu quá trình ra file .csv để mở trong excel. Đây là vấn đề được nhiều người quan tâm và có rất nhiều ứng dụng. Ở đây tôi chỉ trình bày làm sao để cập nhật giá trị quá trình và ghi nó ra file .csv, các bạn có thể dùng đoạn code đó để tùy biến trong ứng dụng của mình như tạo action để cập nhật theo chu kỳ hoặc theo sự kiện.

Bài toán đặt ra là ta có hai tag giá trị quá trình và một nút lệnh "Update CSV". Khi ta click nút lệnh, ta sẽ đọc các giá trị này rồi ghi ra file .csv định sẵn, ta ghi vào cuối file, không xóa các dữ liệu có sẵn, tức là ghi ở chế độ append.

Chuẩn bị

Ta sẽ tạo giao diện như hình:



  • Tạo project WinCC 
  • Tạo hai tag với thông số như bảng sau
Tên
Kiểu dữ liệu
si32Value
Signed 32-bit value
fValue
Floating-point number 32-bit IEEE 754
  • Tạo nút lệnh và hai IOFiled như hình. 
  • Gán text của nút lệnh là "Update CSV". Khi ta click nút này sẽ cập nhật dữ liệu mới vào cuối file csv. 
  • Liên kết tag cho một IOFiled là tag "si32Value". Ta dùng IOField để thay đổi giá trị của tag "si32Value". 
  • Liên kết tag cho IOFiled còn lại là tag "fValue". Ta dùng IOField để thay đổi giá trị của tag "fValue". 
Đến đây ta đã chuẩn bị xong những thành phần cần thiết. Bây giờ ta sẽ tạo mã trong sự kiện "Mouse Click" của nút lệnh "Update CSV".

Tạo mã

Cập nhật file csv gồm các bước sau:

  • Mở file, nếu lỗi thì không làm gì cả. Nếu mở file thành công thì làm các bước sau. 
  • Đọc các giá trị quá trình. 
  • Ghi các giá trị quá trình vào dòng cuối file trong định dạng ([si32Value],[fValue]) 
Sau đây là mã trong C-Script. Ở đây tôi dùng đường dẫn file nằm trong ổ D, bạn chỉ cần tạo thư mục chứa file .csv, không cần phải tạo file csv. Nếu chạy trong Windows7 thì chú ý là phải dùng thư mục được quyền tạo và chỉnh sửa file, nếu không hàm mở file sẽ báo lỗi.

Các bạn có thể tham khảo các hàm dùng cho file như fopen, fprintf, fclose trên mạng nhé.


/*
Script ghi du lieu vao cuoi file. cac gia tri cach nhau boi dau ','
Dinh dang: [si32Value],[fValue]
*/

// Duong dan file csv, nguoi dung co the thay doi no theo y minh
#define CSV_FILE_PATH "D:/csv/export_wincc.csv"

// Khai bao bien
FILE* file = NULL;
int si32Value = 0;
float fValue = 0.0f;

// Mo file va ghi du lieu vao cuoi file. Neu file khong ton tai -> tao file
file = fopen(CSV_FILE_PATH, "a");
if(file == NULL) // Neu khong the mo file -> khong lam gi ca
return;

// doc du lieu tu cac tag
si32Value = GetTagSDWord("si32Value");
fValue = GetTagFloat("fValue");

// Ghi du lieu vao dong cuoi file
fprintf(file, "%d,%f\n", si32Value, fValue);

// Dong file
fclose(file);


Các bạn chỉ cần paste đoạn mã này vào C-Script của sự kiện "Mouse Click" của nút "Update CSV" là xong.

Đến đây ta đã hoàn tất các công việc, bây giờ bạn quay trở lại WinCC Explorer rồi active WinCC runtime để test nhé. Nhớ là phải kích hoạt "Global Script Runtime" cho WinCC Runtime nhé. Các bạn có thể tham khảo cách kích hoạt 
"Global Script Runtime" và tạo Global Action ở link dưới.


http://step7control.blogspot.com/2015/10/tao-chuyen-ong-dung-c-script-va-timer.html

Sau đây là dữ liệu của file mà tôi đã test.




Các bài liên quan:


2 comments:

  1. C-Script của sự kiện "Mouse Click", chổ này mình tìm hoài không thấy, bạn cho mình hỏi thêm, khi các iofield tự động thay đổi thì trong file excell có tự động thay đổi và xuống dòng không

    ReplyDelete
  2. cho mình hỏi là muốn hiện thêm ngày giờ thì dùng lệnh nào vậy a?

    ReplyDelete