2017년 5월 31일 수요일

Arduino와 CiMon 비교


● 연산자
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)


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 통신(비트/워드)


1. 아래그림과 같이 PLC 작성한다







2. CIMON에서  I/0 디바이스 설정  스테이션, Block추가 , 통신포트 설정한다.



3. 태그작성








































4. 작화 및 각 동작설정





















































5. 작화 후  CimonX 실행




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월 24일 수요일

Modbus 워드 읽기


1. 먼저 그림과 같이 plc 프로그램 작성한다.
여기서 _T1S는 1초당 자동으로 ON/OFF











2. NewPLC[B0S0 내장 Cnet] 클릭 하면 기본 설정이 나옴
 그림과 같이 작성후 PLC USB 연결후 쓰기 실행





























3. I/O디바이스 설정


















4. 스테이션  설정




















5. Block  설정












6. 통신포트 설정








7. 데이터 베이스 설정
















8. Cimon 작화 한후 연결한다.





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