● 연산자 | |||||
C 기반 | V/B 기반 | ||||
더하기 | + | + | |||
빼기 | - | - | |||
곱하기 | * | * | |||
나누기 | / | / | |||
나머지 | % | mod | |||
대입 | = | = | |||
증가 후 연산 | b=++a*3 | a를 1 증가시킨 후 3을 곱하여 대입 |
|||
연산 후 증가 | b=a++*3 | 3을 곱한 식을 대입 후 a를 1 증가시킴 | |||
● 관계 연산자 (참이면 1, 거짓이면 0) | |||||
C 기반 | V/B 기반 | ||||
같음 | == | = | |||
같지 않음 | != | <> | |||
초과 | > | > | |||
이상 | >= | >= | |||
미만 | < | < | |||
이하 | <= | <= | |||
a = (b==3) | b가 3이면 a == 1 b가 3이 아니면 a == 0 |
a = (b = 3) | b가 3이면 a = -1 b가 3이 아니면 a = 0 |
||
● 논리 연산자 (참이면 1, 거짓이면 0) | |||||
C 기반 | V/B 기반 | ||||
AND | && and |
좌항이 0 이면 우항 건너뜀 |
and | ||
OR | || or |
좌항이 1이면 우항 건너뜀 |
or | ||
NOT | ! not |
not | |||
XOR | xor | xor | |||
● 조건 연산자 | |||||
c=(a>b)?a:b | 참일 때 a 대입 거짓일 때 b 대입 |
없음? | |||
● 제어문 | |||||
C 기반 | V/B 기반 | ||||
if문 | if (a>10) { } |
if ~ then문 | if a>10 then ~~~~~ if a>10 then ~~~~~ ~~~~~ end if |
||
if~else문 | if (a>10) { } else { } |
if a>10 then ~~~~~ else ~~~~~ end if |
|||
if~else if 문 | if (a>10) { } else if (b>10) { } else { } |
if a>10 then ~~~~~ elseif b>10 then ~~~~~ else ~~~~~ end if |
|||
switch case문 | switch (A) { case 0: ~~~~~~~~~~ break; case 1: ~~~~~~~~~~ break; default: ~~~~~ break; } |
break 없으면 case 아래 case 도 실행됨 |
select case문 | select case A case 0 ~~~~~ case 1 ~~~~~ case else ~~~~~ end select |
|
for문 | for (i=1; i<=5; i++) { } |
for문 종료 후 i==6 break; 로 도중 탈출 |
for~next문 | for i = 1 to 5 ~~~~~ next i |
for문 종료 후 i = 6 exit for 로 도중탈출 |
while문 | while (a==1 && b==2) { ~~~~~ } |
break; 로 도중탈출 상태 검사 후 반복문 실행 |
while문 | while a=1 and b=2 ~~~~~ wend |
|
do~whlie문 | do{ ~~~~~ } while (a>10); |
break; 로 도중탈출 반복문 1번 실행 후 상태를 검사 |
do~loop while문 | do ~~~~~ loop while a>10 |
exit do 로 도중탈출 반복문 1번 실행후 상태를 검사 |
goto문 | goto AAAAA AAAAA: ~~~~~ |
사용하냐 마냐 의견대립 | goto AAAAA AAAAA: ~~~~~ |
||
continue | while (i <= 100) { if ( (i % 3)==0) { continue; } sum += i; i++; } |
i가 3일 때 i++을 건너뛰므로 while문의 조건식은 계속 참이 됨 |
|||
● 기타 | |||||
C 기반 | V/B 기반 | ||||
배열 | |||||
사용자 정의함수 | |||||
지연주기 | delay(1000) | sleep(1000) | |||
작은값 | min(a, b) | ||||
큰값 | max(a, b) | ||||
x^y | pow(2, 3) | ||||
제곱근 | sqrt(5) |
2017년 5월 31일 수요일
Arduino와 CiMon 비교
XG5000과 GXW2 비교
명칭 | XG5000 | 비고 | 명칭 | GXW2 | 비고 |
● 실제 입출력 | |||||
입력릴레이 | P0 | X0 | |||
출력릴레이 | P20 | Y0 | |||
보조릴레이 | M0 | 내부릴레이 | M0 | ||
데이터 레지스터 |
D0 | D0 | |||
인덱스 레지스터 |
Z0 | ||||
● 단축키 | |||||
XG5000 | GXW2 | ||||
a접점 | F3 | F5 | |||
b접점 | F4 | F6 | |||
가로줄 | F5 | CTRL + 방향키 | |||
세로줄 | F6 | CTRL + 방향키 | |||
코일(출력) | F9 | F7 | |||
응용명령 | F10 | F8 | |||
라인삽입 | Ctrl + L | Shift + Ins | |||
라인삭제 | Ctrl + D | Shift + Del | |||
설명문 | Ctrl + E | ; | |||
● 실행 도중 | |||||
XG5000 | GXW2 | ||||
런 중 수정 | Ctrl + Q | 모니터(쓰기) | Shift + F3 | ||
런 중 쓰기 | Ctrl + W | 컴파일 | F4 | ||
수정 종료 | Ctrl + U | 모니터 | F3 | ||
스텝실행 | 디버그모드에서 ctrl + f8 | 스텝실행 | Ctrl + 0 | ||
● 코일 | |||||
XG5000 | GXW2 | ||||
셋(자기유지) | shift + F3 | SET 디바이스 | |||
리셋 | shift + F4 | RST 디바이스 | |||
상승펄스 | PLS 디바이스 | ||||
하강펄스 | PLF 디바이스 | ||||
반전 | FF 디바이스 | ||||
● 접점 | |||||
XG5000 | GXW2 | ||||
정전 시 값 유지 | K릴레이 | ||||
항시 on | _ON | SM400 | |||
항시 off | SM401 | ||||
런 후 1스캔만 on |
SM402 | ||||
1초 클럭 | SM412 | ||||
● 타이머 | |||||
XG5000 | GXW2 | ||||
on타이머 | TON T1 20 | T1 K20 | |||
off타이머 | TOFF T1 10 | 없음 | |||
적산타이머 | TMR T1 50 | ST1 K50 | |||
모노스테이블 | TMON T1 70 | ||||
리트리거블 | TRTG T1 50 | ||||
고속타이머 | H T1 K500 | ||||
티칭타이머 | TTMR D0 K0 | ||||
● 카운터 | |||||
XG5000 | GXW2 | ||||
업카운터 | CTU C1 5 | C1 K5 | |||
다운카운터 | CTD C1 7 | ||||
카운터링 | CTR C3 5 | ||||
1상 업다운 카운터 | UDCNT X2 C1 K5 | X3 상태에 따라 X2 조작시 업다운이 바뀜 |
|||
2상 업다운 카운터 | UDCNT2 X2 C1 K5 | X2가 온 일 때 X3가 상승 시 업 X3가 하강 시 다운 |
|||
● 사칙연산 | |||||
XG5000 | GXW2 | ||||
더하기 | ADDp D10 D0 D10 | +p D0 D10 +p D10 D0 D10 |
|||
빼기 | SUBp D10 D0 D10 | -p D0 D10 -p D10 D0 D10 |
|||
곱하기 | MULp D1 D2 D10 | *p D1 D2 D10 | |||
나누기 | DIVp D1 D0 D10 | D11에 나머지가 저장됨 | /p D1 D0 D10 | D11에 나머지가 저장됨 | |
● 데이터 처리 | |||||
XG5000 | GXW2 | ||||
1:1 데이터 전송 |
MOV D1 D10 | MOV D1 D10 | |||
1:다 데이터 전송 |
FMOV D1 D10 3 | FMOV D1 D10 K3 | |||
다:다 데이터 전송 |
GMOV D0 D10 3 | BMOV D0 D10 3 | |||
문자 데이터 전송 |
$MOV 'Ver-0.01' D20 | $MOV "Ver-0.01" D20 | |||
BCD 변환 | BCD 999 D20 | BCD K999 D20 | |||
아스키 변환 | ASC D1 D30 2 | D1에 상수 쓰지 말 것 | ASC D1 D30 K2 | D1에 상수 쓰지 말 것 | |
한워드의 상하바이트 교환 |
SWAPp D10 | SWAPp D10 |
Modbus 통신(비트/워드)
2017년 5월 30일 화요일
급배기팬 모니터링 시스템
=====================
Sub main()
runscript("timeon")
End Sub
=====================
Sub timeon()
a=0
while 1
SetTagVal "time",a
if a<24 then a=a+1
if a=24 then a=0
sleep(1000)
wend
End Sub
=====================
Sub autoon()
ti=GetTagVal("time")
au=GetTagVal("auto")
if au=1 then
if 5<ti and ti<22 then
SetTagVal "화장배기",1
SetTagVal "복도배기",1
SetTagVal "로비1급기",1
SetTagVal "로비1배기",1
Else
SetTagVal "화장배기",0
SetTagVal "복도배기",0
SetTagVal "로비1급기",0
SetTagVal "로비1배기",0
end if
if 8<ti and ti<19 then
SetTagVal "사무2급기",1
SetTagVal "사무2배기",1
SetTagVal "사무3배기",1
SetTagVal "사무4배기",1
Else
SetTagVal "사무2급기",0
SetTagVal "사무2배기",0
SetTagVal "사무3배기",0
SetTagVal "사무4배기",0
end if
Else
SetTagVal "사무2급기",0
SetTagVal "사무2배기",0
SetTagVal "사무3배기",0
SetTagVal "사무4배기",0
SetTagVal "화장배기",0
SetTagVal "복도배기",0
SetTagVal "로비1급기",0
SetTagVal "로비1배기",0
end if
=====================
2017년 5월 29일 월요일
2017년 5월 24일 수요일
Modbus 워드 읽기
2017년 5월 18일 목요일
디지털, 아날로그 입출력
//////////FND자동카운터
int i,j;
int pin = 7;
int switchState1 = 0;
int switchState2 = 0;
int myDelay = 50;
int prevState1 = 0;
int prevState2 = 0;
int STATUS1 = 0;
int STATUS2 = 0;
int table[16][7] = {
{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,1,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,0,0,1,1}, //9
{1,1,1,0,1,1,1}, //A
{0,0,1,1,1,1,1}, //B
{0,0,0,1,1,0,1}, //C
{0,1,1,1,1,0,1}, //D
{1,0,0,1,1,1,1}, //E
{1,0,0,0,1,1,1} //F
};
void setup() {
fnd(0);
pinMode(2,INPUT);
pinMode(3,INPUT);
for(i=0; i<7; i++)
pinMode(pin+i, OUTPUT);
}
void fnd(int num)
{
j = num;
for(i=0; i<7; i++)
{
digitalWrite(pin+i, table[j][i]);
}
}
void loop() {
switchState1 = digitalRead(2);
switchState2 = digitalRead(3);
delay(myDelay);
if (switchState1 == 1)
{
for(STATUS1=0; STATUS1<16; STATUS1++)
{
fnd(STATUS1);
delay(500);
}
}
if (switchState2 == 1)
{
for(STATUS2=15; STATUS2>=0; STATUS2--)
{
fnd(STATUS2);
delay(500);
}
}
if ((switchState1 == 1) && (switchState2 == 1))
{
fnd(0);
}
delay(myDelay);
}
//////////////가변저항 아날로그입출력
void setup()
{
Serial.begin(9600);
}
void loop()
{
int analogValue0 = analogRead(A0);
analogValue0 = map(analogValue0, 0, 1023, 0, 255);
analogWrite(5,analogValue0);
Serial.print("analogValue0 = ");
Serial.println(analogValue0);
delay(50);
}
////////////조그스틱 입출력
void setup()
{
Serial.begin(9600);
}
void loop()
{
int analogValue0 = analogRead(A0);
int analogValue1 = analogRead(A1);
analogWrite(5,analogValue0);
analogWrite(6,analogValue1);
Serial.print("( ");
Serial.print(analogValue0);
Serial.print(" , ");
Serial.print(analogValue1);
Serial.print(" )");
Serial.print("\n");
delay(300);
}
2017년 5월 17일 수요일
인형뽑기
//////Main
Sub main()
runscript("A작동")
runscript("B작동")
runscript("C작동")
End Sub
////////실린더A 작동
Sub A작동()
while 1
butA = GetTagVal("버튼A")
cylA = GetTagVal("실린더A")
if (butA=1) then
cylA = cylA+10
else
cylA = cylA-10
end if
Sleep(200)
SetTagVal "실린더A",cylA
Wend
End Sub
////////실린더B 작동
Sub B작동()
while 1
butB = GetTagVal("버튼B")
cylB = GetTagVal("실린더B")
if (butB=1) then
cylB = cylB+10
else
cylB = cylB-10
end if
Sleep(200)
SetTagVal "실린더B",cylB
Wend
End Sub
////////실린더C 작동
Sub C작동()
while 1
butC = GetTagVal("버튼C")
cylC = GetTagVal("실린더C")
if (butC=1) then
cylC = cylC+10
else
cylC = cylC-10
end if
Sleep(200)
SetTagVal "실린더C",cylC
Wend
End Sub
////////자동운전
Sub 자동운전()
SetTagVal "버튼A",1 ''A전진
Sleep(1000)
SetTagVal "버튼B",1 ''B전진
Sleep(1000)
SetTagVal "버튼C",1 ''집게잡기
Sleep(2000)
SetTagVal "버튼B",0 ''B후진
Sleep(1000)
SetTagVal "버튼A",0 ''A후진
Sleep(1000)
SetTagVal "버튼B",1 ''B전진
Sleep(1000)
SetTagVal "버튼C",0 ''집게풀기
Sleep(2000)
SetTagVal "버튼B",0 ''B후진
Sleep(1000)
End Sub
2017년 5월 10일 수요일
피드 구독하기:
글 (Atom)