Current Transformer คืออะไร

Current Transformer นั้นเป็นอุปกรณ์วัดค่ากระแสไฟฟ้าโดยการลดทอนปริมาณกระแสจากด้าน Primary ลงโดยเป็นการลดที่เป็นแบบแปรผันตรง เพื่อนำกระแสด้าน Secondary เข้าวงจร Electronic เพื่อใช้คำนวณค่ากระแสที่วัดได้

หลักการการทำงานของ Current Transformer เมื่อมีกระแสไหลผ่าน CT ก็จะเกิดการเหนี่ยวนำของสนามแม่เหล็กไฟฟ้าทำให้เกิดกระแสไฟฟ้าทางด้าน Secondary โดยกระแสที่เกิดขึ้นจะมีปริมาณลดลงเท่ากับ Ratio ของ CT, Ratio = n2 (รอบพันคอยด์ของ Secondary) ÷ n1 (รอบพันคอยด์ของ Primary) ซึ่งมาจากสูตรด้านล่างนี้

ตัวอย่างเช่น หาก Ratio ของ CT เท่ากับ 2500 เท่า เมื่อกระแสไฟฟ้าไหลผ่านทางด้าน Primary 100 A ทาง Secondary ก็จะมีกระแสไหลเท่ากับ 100 ÷ 2500 = 0.04 A

สำหรับตัวอย่างการนำเอา Current transformer ไปใช้งานจริง เช่น มิเตอร์ไฟฟ้า แคมมิเตอร์วัดไฟฟ้า เหล่านี้เป็นต้น

ทำความเข้าใจเกี่ยวกับ ppm

คำว่า ppm นั้นย่อมาจาก parts-per-million หรือหนึ่งในล้านส่วน ถ้าเราแปลง ppm เป็นตัวเลขนั้นหมายถึง 1 ÷ 1,000,000 = 0.000001 = 10^−6 (สิบยกกำลังลบ6)

ตัวอย่าง หากเราบอกว่านาฬิกาเรือนหนึ่งมีค่าความผิดพลาดอยู่ที่ 20 ppm วินาที นั้นหมายความว่าเวลาเราดูเวลาจากนาฬิกาเรือนนี้จะมีโอกาสที่เวลาจะเดินผิดพลาดได้ 20 วินาที จาก 1 ล้านวินาที
ถ้าคิดต่อว่าถ้าเทียบแล้ว 1 วันแล้วเวลาเดินผิดไปกี่วินาทีเราสามารถคำนวณได้ว่า
86400 x (20 ÷ 1,000,000) = 1.728
นั้นแสดงว่าค่าความผิดพลาดที่ 20 ppm วินาที ทำให้เวลาเดินผิดพลาด 1.728 วินาทีต่อวันนั้นเอง

นอกจาก ppm แล้วยังมี
ppb (parts-per-billion, 10^−9, 1 ÷ 1,000,000,000) หนึ่งในพันล้านส่วน
ppt (parts-per-trillion, 10^−12 , 1 ÷ 1,000,000,000,000) หนึ่งในล้านล้านส่วน
ppq (parts-per-quadrillion, 10^−15, 1 ÷ 1,000,000,000,000,000) หนึ่งในพันล้านล้านส่วน

การคำนวณค่าความต้องการใช้ไฟฟ้าเฉลี่ย Block Demand

เราสามารถคำนวณ Demand หรือ ความต้องการใช้ไฟฟ้าเฉลี่ย ได้จากค่าพลังงานจากสูตรนี้

Demand = Energy x (60 ÷ Demand interval)

โดย
Demand คือ ความต้องการใช้ไฟฟ้าเฉลี่ย มีหน่วยเป็น W หรือ var
Energy คือ พลังงาน มีหน่วยเป็น Wh ในกรณีที่หา Demand W และจะเป็น varh ในกรณีที่หาค่า Demand var
Demand interval คือค่า Block เวลาที่ใช้ในการเฉลี่ย มีหน่วยเป็นนาที (ใช้ 15 นาที สำหรับประเทศไทย)

เราจะคิดค่า Demand จะมีการคำนวณค่าใหม่ทุกๆนาทีที่ครบตาม Demand Interval
หาก Demand interval คือ 15 นาทีเราก็จะคิด Demand Interval ที่นาทีที่ 00, 15, 30, 45
เช่นเวลา 00:00, 00:15, 00:30, 00:45, 01:00, 01:15, … ไปเรื่อยๆ

ตัวอย่าง ในการคำนวณค่า Demand W
ในช่วงเวลา 9:00 ถึง 9:05 มีการใช้ไฟฟ้า ที่ 230V 20A ก็จะได้ค่า Active Power = 4,600 และ Active Energy = 383.33 Wh
ในฃ่วงเวลา 9:05 ถึง 9:10 มีการใช้ ไฟฟ้า ที่ 230V 40A ก็จะได้ค่า Active Power = 9,200 และ Active Energy = 766.67 Wh
ในช่วงเวลา 9:10 ถึง 9:15 มีการใช้ ไฟฟ้า ที่ 230V 30A ก็จะได้ค่า Active Power = 6,900 และ Active Energy = 575 Wh
ดังนั้นเราจะได้ Active Energy ผลรวมจะได้ 1,725 Wh = 383.33 + 766.67 + 575
เมื่อคำนวณ Demand จะได้ 6,900 W = 1,725 x (60 ÷ 15)

และเมื่อเอามาพลอตกราฟก็จะได้กราฟดังรูป จะสังเกตว่า Instantaneous power จะเป็นกราฟที่เรียบเนื่องจากเราสมมติให้มีการใช้งานที่คงที่

แต่ในการใช้งานจริงๆแล้ว ค่า Instantaneous Power อาจจะไม่คงที่ ดังรูปนี้

จากตัวอย่างผลลัพธ์ที่เราคำนวณได้นั้นหมายความว่า ใน 15 นาทีนี้เรามีความต้องการใช้กำลังโดยเฉลี่ยเท่ากับ 6,900 W

และใน Demand var ก็จะมีการคำนวณเช่นเดียวกันเพียงแต่เปลี่ยนจาก Active Power และ Active Energy มาเป็น Reactive Power และ Reactive Energy แทน

ซึ่งวิธีการคำนวณค่า Demand แบบนี้เราเรียกได้ว่าเป็นการคำนวณค่า Demand แบบ Block Demand นั้นเอง

วิธีใช้ GCC กับภาษา C หลายๆไฟล์

วิธี Compile ภาษา C โดยใช้ GCC สำหรับในกรณีที่ไฟล์ .c หลายไฟล์ เป็นโปรเจคเดียวกัน สามารถใช้วิธี compile โดยใช้ GCC ได้ดังนี้

ขั้นแรกให้เรา Compile ไฟล์ .c แต่ละไฟล์ โดยใช้ –c เพื่อบอกว่า compile ไฟล์นี้เท่านั้น ไม่ต้อง link กับไฟล์อื่น

gcc -c ไฟล์ที่1.c
gcc -c ไฟล์ที่2.c

ไปเรื่อยๆ ขึ้นอยู่กับตามจำนวนไฟล์ .c

หลังจากนั้นเราก็จะได้ ไฟล์ object นามสกุล .o ออกมา เสร็จแล้วทำการ link ไฟล์ object แต่ละไฟล์เข้าด้วยกัน

gcc -o โปรแกรม.exe ไฟล์ที่1.o ไฟล์ที่2.o

ให้เราใส่ ไฟล์ .o ตามจำนวนไฟล์ .c ของโปรแกรมเรา

ตัวอย่าง สมมติว่ามีไฟล์
hellofunc.c

#include <stdio.h>
#include "hellomain.h"

void myPrintHello(void) {

  printf("Hello HAHAHA!\n");

  return;
}

hellomain.c

#include "hellomain.h"

int main() {
  // call a function in another file
  myPrintHello();

  return(0);
}

hellomain.h

void myPrintHello(void);

การใช้ GCC ถ้าเป็น windows

gcc -c hellofunc.c
gcc -c hellomain.c
gcc -o program.exe hellofunc.o hellomain.o


การใช้ GCC ถ้าเป็น linux

gcc -c hellofunc.c
gcc -c hellomain.c
gcc -o program hellofunc.o hellomain.o
./program

ก็จะได้ผลลัพธ์ตามรูป

วิธีใช้ GCC กับภาษา C ด้วย -Wall

สำหรับคำสั่งของ GCC ที่ใช้การ compile ใน ภาษา C ที่สำคัญและมีประโยชน์อีกคำสั่งนั้นก็คือ –Wall
โดย –Wall นั้นหมายความวว่าเราต้องการให้ GCC แจ้งเตื่อน Warning ทั้งหมด หรือ Show warning all นั้นเอง

ตัวอย่างของ การใช้ –Wall และผลลัพธ์ของการเตื่อน Warning

helloworld3.c

#include <stdio.h>
#include "helloworld3.h"

int main (void)
{
    int x;

    
    printf("%s\n", HELLO);
    return 0;
}

helloworld3.h

#define HELLO "HELLO WORLD 3"

จะเห็นว่าถ้าไม่ใช้ -Wall ก็จะไม่มีคำเตื่อนอะไรเลย

ส่วนถ้าใส่ -Wall ก็จะขึ้นดังรูป

จะเห็นว่ามี Warning บอกว่า 6:9 warning : unused variable ‘x’
นั้นหมายความว่า ไม่มีการใช้งานตัวแปร x โดยตัวเลข 6:9 นั้นเป็นการบอกตำแหน่งของ warning ที่ source code บรรทัดที่ 6 คอลัมน์ที่ 9 (นับเป็น space ก็จะได้ 9 space)

วิธีใช้ GCC กับภาษา C

วิธีการ Compile ภาษา C โดยใช้ Gnu GCC compilerในกรณีที่มีไฟล์ภาษา C หนึ่งไฟล์ สามารถ Compile ออกมาเป็นโปรแกรมได้โดยใช้คำสั่งตามนี้

ในกรณี Windows (compile เพื่อให้ output ออกมาเป็นไฟล์ exe)

gcc –o ชื่อโปรแกรม.exe ชื่อไฟล์..c

หรือ

gcc ชื่อไฟล์..c –o ชื่อโปรแกรม.exe

ในกรณี Linux (compile เพื่อให้ output เป็นไฟล์ที่ไม่ต้องมีนามสกุล หรือจะเป็นไฟล์ที่มีนามสกุล.out ก็ได้เช่นกัน)

gcc –o ชื่อโปรแกรม ชื่อไฟล์..c

หรือ

gcc –o ชื่อโปรแกรม.out ชื่อไฟล์..c

หรือ

gcc ชื่อไฟล์..c –o ชื่อโปรแกรม

หรือ

gcc ชื่อไฟล์..c –o ชื่อโปรแกรม.out

จะเห็นว่าสามารถสลับตำแหน่งการเรียงคำสั่งได้


ตัวอย่างเช่นถ้าเรามีไฟล์ helloworld.c

#include <stdio.h>

int main (void)
{
    printf("HELLO WORLD\n");
    return 0;
}

Compile helloworld.c ใน Windows

gcc –o helloworld.exe helloworld.c
helloworld.exe

Complie helloworld.c ใน Linux

gcc –o helloworld helloworld.c
./helloworld

ส่วนในกรณีที่ ไฟล์ C ของเรามีการ include header file เข้ามาด้วย เวลาใช้คำสั่ง gcc ก็ไม่ต้องสนใจไฟล์ header .h ให้เราทำการ compile แค่ไฟล์ .c ตามปกติ
ตัวอย่างเช่น
helloworld2.c

#include <stdio.h>
#include "helloworld2.h"

int main (void)
{
    printf("%s\n", HELLO);
    return 0;
}

helloworld2.h

#define HELLO "HELLO WORLD 2"

Complie helloworld.c ใน Windows

gcc –o helloworld2.exe helloworld2.c
helloworld2.exe

การเก็บ Code เก่าไว้ ในภาษา C

หากมีการแก้ไข Code บางส่วน แล้วเราต้องการที่จะเก็บ Code เก่าบางส่วนเอาไว้เพื่อเอาไว้อ้างอิง ในอนาคตในภาษา C ซึ่งมีอยู่หลายวิธี

หลายๆคนอาจจะใช้วิธีการ Block comment แต่การ Block comment นั้นมีข้อเสียตรงที่ หากใน Code ของเรามี Block comment อยู่ก็จะให้เกิด syntax error ได้ ตามตัวอย่างด้านล่างนี้

#include <stdio.h>

int main(void)
{

 
 /*   /* Month */
    printf("This month is May\n");

    printf("This month is Jul\n"); */
 

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

อีกวิธีหนึ่งก็คือการใช้ #ifdef NOT_DEFINE แล้วปิดด้วย #endif ก็สามารถทำได้เช่นกัน แต่ก็มีข้อเสียตรงที่ต้องระวังหากมีใครไปเปิดปิด ค่า Define ของเรา ก็จะทำให้ code ที่เราปิดไว้ทำงานขึ้นมาได้

จึงมีอีกวิธีหนึ่งก็คือการใช้ #if 0 แล้วปิดด้วย #endif ซึ่ง compiler จะ compile #if 0 ออกมาเป็น เท็จเสมอทำให้ code ที่เราปิดไว้ไม่ถูก compile นั้นเอง
ตัวอย่างการใช้ #if 0

#include <stdio.h>

int main(void)
{
    #if 0
    /* Month */
    printf("This month is May\n");

    printf("This month is Jul\n");
    #endif

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

แต่ข้อเสียของ #if 0 ก็มี นั้นคือ ไม่สามารถใช้กับ code ที่เขียนไม่ถูกต้องได้ เช่น การเขียนภาษาอื่นที่ไม่ใช่ภาษา C หรือ การใส่เครื่องหมาย double quote(“) หรือ single quote (‘) ที่ไม่ครบ หรือการใช้ block comment ที่ไม่ครบ block ก็จะทำให้เวลาใช้ #if 0 แล้วทำให้ compile แล้ว error
ตัวอย่าง

Double quote(“) ไม่ครบ

#include <stdio.h>

int main(void)
{

    #if 0
    /* Month */
    printf(This month is May\n");

    printf("This month is Jul\n");
    #endif

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

Block comment ไม่ได้ปิดท้าย

#include <stdio.h>

int main(void)
{

    #if 0
    /* Month
    printf("This month is May\n");

    printf("This month is Jul\n");
    #endif

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

อีกวิธีก็คือการใช้ Line comment ข้อเสียของวิธีนี้ก็คือ ต้องใช้ความสามารถของ IDE หรือ Text editor ช่วยในการ comment ในกรณีที่ code มีหลายๆบรรทัด ซึ่งส่วนใหญ่จะมีฟังชั่นเหล่านี้อยู่แล้ว
Line comment short cut ใน Sublime Text ก็คือ (Ctrl + /)
Line comment short cut ใน Notepad++ ก็คือ (Ctrl + k)
ตัวอย่าง Line comment

#include <stdio.h>

int main(void)
{


    // /* Month*/
    // printf("This month is May\n");

    // printf("This month is Jul\n");


    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

ดังนั้นหากจะต้องการที่จะเก็บ Code เก่าบางส่วนเอาไว้เพื่อเอาไว้อ้างอิง ก็ขอแนะนำให้ใช้ Line comment หรือหันมาใช้พวก Version control ดีกว่า

ขนาดของตัวแปรใน ภาษา C ในแต่ละ CPU

ขนาดของตัวแปรใน ภาษา C หรือ C++ นั้นจะขึ้นอยู่กับชนิดของ CPU และ Complier ซึ่งอาจจะเหมือนกันหรือต่างกันก็ได้ เรามาดูกันดีกว่าว่าแต่ละ CPU มีการกำหนดขนาดตัวแปรที่แตกต่างกันอย่างไร

ขนาดของตัวแปรใน x86

ขนาดของตัวแปร ใน CPU ARM 32 bit

อ้างอิงจาก ARM Compiler Reference

ขนาดของตัวแปรใน MCU TI MSP430

อ้างอิงจาก slaa534 MSP430 Embedded Application Binary Interface

จะเห็นได้ว่า แต่ละ CPU จะมีขนาดของตัวแปรที่กำหนดแตกต่างกันไป ดังนั้นการเขียนโปรแกรมในภาษา C หรือ C++ แล้วนำเอาไปใช้งานในแต่ละ CPU จึงต้องระมัดระวัง เนื่องจากขนาดของตัวแปรที่แตกต่างกันอาจจะทำให้โปรแกรมของเราทำงานได้ไม่ถูกต้องก็ได้

ค่าสูงสุดและต่ำสุดของตัวแปร Real ในภาษา C

เราสามารถหาค่าสูงสุดและต่ำสุดของตัวแปร ตัวเลขจำนวนจริง (Real) แต่ละชนิดในภาษา C ได้จากค่า Define ที่อยู่ใน ไฟล์ float.h

ตารางด้านล่างนี้แสดง Define ที่ใช้สำหรับกำหนดค่าสูงสุด (Max) หรือต่ำสุด (Min) และความละเอียด (Precision)

ซึ่งสามารถนำเอาค่า Define มา print แสดงค่าได้ โดย Include ไฟล์ float.h ดัง Source code ตัวอย่าง

#include <stdio.h> /* For command line input and output */
#include <float.h> /* For limits on floating-point types */

int main(void)
{
    printf("min float is %.6e\n", FLT_MIN);
    printf("max float is %.6e\n", FLT_MAX);
    printf("float provide %u decimal digits precision.\n\n", FLT_DIG);

    printf("min double is %.15e\n",DBL_MIN);
    printf("max double is %.15e\n", DBL_MAX);
    printf("double provide %u decimal digits precision.\n\n", DBL_DIG);

    printf("min long double is %.18Le\n", LDBL_MIN);
    printf("max long double is %.18Le\n", LDBL_MAX);
    printf("long double provide %u decimal digits precision.\n",LDBL_DIG);

    return 0;
}

จะได้ผลลัพธ์ดังนี้ (Windows 7 32 bit, gcc 4.9.2)

สำหรับใครที่ลองเอา Code ไปรันแล้วเจอค่าขึ้น -1.#QNAN e+000 ดังรูป

วิธีแก้ไขก็คือเวลาที่เรา Compile ให้กำหนด standard ด้วย เช่น –std=c99 เวลา compile กับ gcc

สำหรับคนที่ใช้ Code Block ก็ให้เข้าไป Setting ค่าที่ setting complier ให้ ติ๊กถูก “Have gcc follow the 1999 ISO C language standard [-std=c99]”