https://m.blog.naver.com/kji9653/221900031533

 

비트(bit)와 바이트(Byte)란?왜 8비트는 1바이트인가? 킬로바이트(kilobyte)  메가바이트(megabyte) 기가

안녕하세요. 비티샘입니다. 오늘은 우리의 이진법 체계에서 자주 사용하는 비트에 대해 알아보겠습니다. C...

blog.naver.com

위에 링크에 잘 나와있어서 퍼왔음.

 

※ 기초

▶ 1 byte는 8비트로 되어있다.

- 1111 1111 -> 8비트로 표현 가능한 최대 크기

- 0000 0000 -> 8비트로 표현 가능한 최소 크기

 

▶ 1byte는 256가지 표현가능하다.

▶ ASII코드는 127가지가 있다.

- 1 byte로 ASCII코드 하나씩 충분히 표현 가능하다.

https://ko.wikipedia.org/wiki/ASCII

 

ASCII - 위키백과, 우리 모두의 백과사전

1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문 알파벳을 사용하는 대표적인 문자

ko.wikipedia.org

 

▶ 진수 변환

- 0 또는 1로 표현되면 2진수이다. Binary Code(바이너리)라고 한다.

- 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 로 표현되면 10진수이다. Demical(데미칼)이라고 한다.

- 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , A , B , C , D , E , F 로 표현되면 16진수이다.

HEXADEMICAL(헥사)이라고 한다.

 

https://m.blog.naver.com/icbanq/221727893563

 

[진법변환] 2진수,8진수,10진수,16진수 쉽게 변환하는 방법 알아보기!

안녕하세요~~! 오늘도 여러분들께 유익한 정보를 드리러 온 나도비 입니다 !! 오늘의 주제는 2진수,8진수,1...

blog.naver.com

변환방법은 위 링크에 잘 나와있어서 퍼왔음.

▶ 2진수 -> 16진수

0000 1110의 2진수가 있다.

0000 / 1110의 4비트식 나눠서 계산하면 편하게 16진수를 구할 수 있다.

0 0 0 0 / 1 1 1 0

↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑

(2^3 * 0)+(2^2 * 0)+(2^1*0)+(2^0 * 0) / (2^3 * 1)+(2^2 * 1)+(2^1*1)+(2^0 * 0)

결론 : 0 / E -> 0E 헥사값이 됌
(^ 는 제곱을 의미함)

 

▶ 프로토콜(Protocol)

- 내가 상대방에게 데이터를 보내면 상대방이 무엇이 어떻게 어떤건지를 받는지를 알 수 없는 상태라면 내가 아무리 데이터를 보내도 상대방은 전혀 그 데이터의 내용을 모른다. 그래서 상대방이랑 나랑 같은 방식으로 보내고 받는다면 무슨말인지 알아 들을 수 있을 것이다. 그게 바로 프로토콜이다. (고오오오오급진 말로는 통신규약이다.)

※ 이제 한번 코딩을 해보자.

준비물 : C# , ls-ig5a 인버터 , ls-ig5a-manual , visual studio 2019 community

https://www.ls-electric.com/ko/product/view/P01187

 

LS ELECTRIC

스마트 에너지의 미래를 열어가는 LS ELECTRIC

www.ls-electric.com

ls-ig5a제품설명은 위 링크에 가면 잘 나와있다.

 

우선적으로 인버터랑 시리얼 포트를 연결해야된다.

 

위의 인버터에서 S+,S- 를 RS485 USB 컨버터에 D+,D-로 연결을 해준다.

(S+ → D+ 연결 , S- → D- 연결)

 

그다음 비쥬얼 스튜디오 2019를 켠다. 그다음은 순서대로 하면 됌(여기선 C#으로 함)

ls-ig5a 통신 메뉴얼을 보겠다.

11장 RS-485통신을 누른다.

 

스크롤을 내리다보면 통신선 연결 부분이 있다. 인버터에 설정하는 방법은 메뉴얼 보면 있으니 찾아서 RS-485통신에 맞게 설정해주자.

여기서 사용할 통신 프로토콜은 LS BUS 이다.

 

위의 그림에서 1번은 LS BUS 프로토콜이다.

"" 로 표시된것은 아스키값 , h가 붙은건 헥사값으로 넣으면 된다.

ⓐ ENQ -> 05h -> 1byte 의 뜻은 프로토콜 처음 시작이 ENQ이며 데이터 길이는 1byte이고 05h 는 05라는 hex값으로 넣으라는 의미이다.

ⓑ 국번-> "01" -> 2bytes 뜻은 프로토콜 두번째 시작이 국번이며 데이터 길이는 2bytes이고 "01"의 ASCII문자 값을 넣으라는 의미이다. 시리얼 통신은 1byte식 데이터를 송수신하기 때문에 "01"이 "0"-> 1byte에 저장 , "1" -> 1byte에 저장 하기 때문에 2byte 데이터 길이로 정해진다. 국번은 데이터를 송신할 때 필요한 인버터에게 송신을 하려고 할때 쓰인다. 만약 최대 31개의 인버터가 연결되어있으면 데이터는 다 송신 되지만 정확히 해석하는 인버터는 국번이 맞는 인버터만 해석을 한다. 나머지는 에러 수신을 한다.

ⓒ CMD-> "R" -> 1byte 는 위에 나와있듯이 명령어이다. R은 읽기 W는 쓰기 X는 모니터 등록요구 Y는 모니터 등록 실행. ASCII문자 값을 넣는다.

ⓓ 번지 -> "3000" -> 4bytes는 명령을 내릴 주소(Adress)이다. ASCII문자 값을 넣는다. 메뉴얼 아래에 보면 주소가 나와있다.


ⓔ 번지개수 -> "1"~"8" = n -> 1byte 주소안에 명령을 내릴 데이터의 총 갯수이다. 한꺼번에 명령을 8개나 내릴 수 있다. ASCII문자 값을 넣는다.

SUM ->"A7" -> 2bytes 는 국번 , CMD, 번지 , 번지개수 를 더한값 즉 체크썸을 만든다. ASCII문자 값을 넣는다.(체크썸이란 프로토콜의 신뢰성 즉 데이터가 정확한가에 대해서 한번더 검사하기 위한 것이다.)


예를들어 만드는 방법

  국번 CMD 번지 번지개수 SUM합계
  "01" "R" "3000" "1"  
  "0" "1" "R" "3" "0" "0" "0" "1"  
SUM 30h(헥사) 31h(헥사) 52h(헥사) 33h(헥사) 30h(헥사) 30h(헥사) 30h(헥사) 31h(헥사) 1A7h(헥사)

SUM = 30h + 31h + 52h + 33h + 30h + 30h + 30h + 31h = 1A7h 로 나온다. 하지만 2byte로 적용시켜서 1A7중 1은 없애고 "A7만 넣도록 한다."이제 코딩으로 들어가보자

WinForm하나 만들었다. 이것저것 붙여놨음. C#은 SerialPort 편하게 쓰게 만들어 놨으니 옮겨서 WinForm창에 넣으면 밑에 serialPort1이 생길것이다.

※정회전 통신을 보내 보겠다. 아래를 보도록 하자

foreach(var key in System.IO.Ports.SerialPort.GetPortNames())
{
COMList.Items.Add(key);
}

Winform에서 국번설정 밑에 있는 txtbox가 COMlist이다. 실행시 디바이스에 열려있는 COMPORT를 가져온다.

private void button1_Click(object sender, EventArgs e) 는 Winform에 COM연결이라는 버튼이 있다. 그것이다. 시리얼 포트 열기전 설정을 하고 열어준다.
설정하는 PortName , BaudRate, DataBits , Parity, StopBits는 장치관리자에 연결된 COMPort 속성이 가면 있다.

초기 설정값과 컴포트의 설정하는 값이 동일해야된다. 그래야 시리얼 포트가 열린다.
serialPort1.PortName -> 현재 연결된 COM이름으로 설정
serialPort1.BaudRate -> 비트 / 초랑 맞추며 된다.
serialPort1.Databits -> 데이터 비트랑 맞추면 된다.
serialPort1.Parity -> 패리티랑 맞추면 된다.
serialPort1.StopBits -> 정지 비트랑 맞추면 된다.

데이터를 보내보자.

메뉴얼에 보면 인버터에게 쓰기를 요청하는 프로토콜이 있다. 여기에서 아까 위에서 봤뜻이 형태는 같지만 "데이터"라는게 추가가된다. 똑같이 데이터를 가공해서 붙여주기만 하면 된다.
여기에선 강제로 하드코딩으로 값을 넣어줬다.

(테스트를 할 목적이기 때문에 통신만 된다면 데이터 가공은 능력껏 하면 되기 때문이다.)

여기서 주의할 점은 " " 안에 들어가는 문자들은 헥사값이다. 고로 문자화 된 헥사값을 넣는것이다. 중요하다.

쓰기 요구에 보면 byte가 1개 1데이터만 보내면 총 16바이트가 필요하다. 그래서 위에 바이트 메모리를 16개로 만들어줬다.

ENQ는 05h이기 때문에 헥사값으로 넣어줬다.

ⓒ 국번은 1번지로 인버터에서 세팅 했기 때문에 "01"을 넣어야되지만, 국번 바이트수는 2byte를 넣게 되어있다. 그래서 "0" , "1"을 따로 넣는다. 그리고 "0"은 문자값이기 때문에 byte로 변환시켜줘야된다. C#은 문자값을 byte로 변환해주는 함수가 있다. 이것을 써서 변환해준다.(참고로 "0에 대한 아스키 코드의 16진수값을 넣어도되고 1도 마찬가지이다.)

CMD는 쓰기요구이기 때문에  "W" 값이 들어간다.  아스키코드표를 보면 "W"의 16진수 값이 0x57이다. 이걸 넣어줬다.

번지는 위에 사진에서 보면 파라미터 코드 리스트에 보면 Address가 있을것이다. 운전지령의 Address는 0x0006이다. 그래서 번지자리에 "0","0","0","6"이 들어간다.

번지개수는 1~8개까지 가능한데 "1"을 넣어준이유는 위의 번지를 0006 하나밖에 안넣었기 때문에 1개로 넣어줬다.

데이터는 "0","0","0","2"가 들어간다. 왜 그런지 아래의 사진을 보자.

운전지령의 R/W를 보면 BIT 0 : 정지(0->1)이 되어있다. 이말이 무슨뜻이냐면 1byte는 8bit다. 8bit의 0번째 인덱스 즉 0000 0000 -> 0000 0001 가 되면 정지 지령의 데이터가 된다는 말이다. 이걸 토대로 정방향은 0000 0010 정방향 운전 데이터가 되고, 역방향은 0000 0100 역방향 데이터가 되겠다.

2진수를 16진수로 변환하면 0x00이 정지 , 0x02가 정방향 , 0x04가 역방향이 되겠다. 그러나 위에선 데이터가 4byte로 넣어야되기 때문에 0x0000 , 0x0002 , 0x0004로 되어야된다. (0x00 이나 0x0000이나 똑같음) 여기에선 정방향으로 운전을 하려고 하니 "0","0","0","2"를 넣어줬다.

SUM은 체크썸 값을 넣어준다. 체크썸 값은 ENQ ,SUM , EOT를 제외한 나머지의 값들의 합이다. 고로 국번,CMD,번지,번지개수,데이터 들의 합이다. 다 더하면 625의 정수값(10진수)을 얻을 수 있는데 이것을 HEX로 변환하면 271의 값을 얻을 수 있다. 하지만 체크썸의 값은 2byte고 앞에서 봤듯이 뒤의 자리 2자리만 남기도록 하고있다. 그래서 "7","1"을 넣어줬다.

EOT는 0x04이여서 0x04를 넣어줬다.

마지막으로 bBuffer배열에 바이트를 차례대로 넣어주고 serialPort1.Write(bBuffer , 0 , bBuffer.Length) 를 넣어주면 된다. 뒤에 0이랑 bBuffer.Length는 버퍼의 크기를 설정한다고 생각하면 된다. 0에서 버퍼의 최대크기를 넣는다.

 

이제 주파수를 넣어보자.

주파수를 넣어야되기 때문에 위와 동일한 쓰기 프로토콜로 넣어준다.

ⓐ ENQ ~ 쓰기 까지는 위와 동일하다.

ⓑ 주파수의 지령번지는 0x0005이다. 

ⓒ 번지 개수도 지령번지 1개를 보내기 때문에 위와 동일하다.

ⓓ 데이터는 십진수 2000의 값에 대한 16진수 데이터 0x07D0의 값이 들어간다. 위에서 설명 했다 시피 문자화 된 헥사값을 넣어야 인버터에서 해석을 해 주파수 20.00이 들어간다. 왜 20.00이 들어가냐면 아래의 그림을 보자.

주파수의 단위가 0.01 hz이고 여기 인버터는 00.00hz ~ 60.00 hz를 지원하기 십진수 1을 넣으면 0.01hz가 증가될것이다. 고로 십진수 2000을 넣으면 인버터에서 20.00hz로 변환이 된다. (주파수를 이것저것 넣어 봤는데 최소 00.50hz이상부터 입력이 가능하더군요...)

ⓔ 체크썸도 위와 동일하다. 그래서 값을 구해서 뒤에 두자리만 구하면 "8","9"가 나온다.

 

이제 쓰기는 끝이났다. 어떻게 넣어야 될지를 알기 위해 하드코딩으로 강제로 넣었지만 이제 생각해서 코딩을 짜보길 바란다. 끗

 

CPU : QD75P1N , 앰프 : MR-J4-10A를 사용하였습니다.

QD75P1 : QD75 => 위치모듈종류 , P => 오픈컬렉터(만약 D=> 차동드라이버)

(참고 : 오픈 컬렉터는 노이즈잡기가 힘듬. 차동 드라이버는 노이즈잡기가 수월함.)

 

----------------------------------------------------------------------------------------------------------------------------------

그림1

- PLC Parameter에서 I/O Assignment에서 Read PLC Data를 불러온다.

그림2

 

- Intelligent Function Module -> New Module로 파일을 새로 만든다.

- QD75 Type Positioning Module로 설정

- QD75P1N로 설정.

- Acknowledge I/O Assignment 클릭 -> Intelli. 클릭후 Setting 을 눌러서 설정

그림3

----------------------------------------------------------------------------------------------------------------------------------

 

그림 4

- Intelligent Funtion Module -> Parameter 을 더블 클릭을 한다.

- Unit setting : mm로 설정(초기에 움직을 서보모터 단위)

- No, of pulses per rotation : 서보 모터 1번 회전 시 펄스 수

(참고 : hg-kr13의 모터의 경우 최대 분해능 2^22이므로 전자 기어비를 사용하여 최대 분해능 수치를 맞춘다. Ex) PLC 설정 분해능 값 : 2^13 => 8192 , 앰프 분해능 값 : 2^9 => 512로 설정 그래서 최대 분해능 2^22을 맞춘다.)

- Movement amount per rotation : 서보 모터 1번 회전 시 이동거리 설정 여기선 10mm로 설정이 되어있어 , 마이크로 단위로 변경 10000um인데 PLC에서 설정값을 초과하기 때문에 1000um로 설정한다.

- Unit magnification : Movement amount per rotation의 설정값의 배율을 설정한다.

위에서 1000um를 설정하고 10배로 설정하면 10000um가 설정이 되어진다.

- Roatation direction setting : 서보 모터 회전 방향을 결정하여 전진or 후진을 설정할 때 필요하다. (일단 돌려보고 전진,후진 선택을 하여 조정하면 되겠다.)

 

----------------------------------------------------------------------------------------------------------------------------------

 

그림5

- JOG speed limit value : 수동으로 제어 하기 위해 JOG 스피드 조절.

----------------------------------------------------------------------------------------------------------------------------------

 

그림 6

OPR : 원점복귀

- OPR method : Near - point Dog Method로 설정 (DOG 방식으로 설정. 아래에 설명)

- OPR direction : Reverse Direction(Address Decrease Direction) 으로 설정(아래에 설명)

- OPR speed : 500mm/min으로 설정

- Creep speed : 200mm/min으로 설정(아래에 설명)

- OPR retry : Retry OPR  with limit switch로 설정(아래에 설명)

 

아래는 왜 이렇게 설정했는지 설명이다.

그림6

RLS : 하한 센서 (하한 Limit 값)

FLS : 상항 센서 (상한 Limit 값 )

 

DOG : 전원을 껏다가 켰을 시 원점을 복귀하기 위해선 기준이 되는 무언가가 있어야된다. 그래서 서보모터가 움직였을 때 DOG의 기준으로 원점을 찾기 위해 달아둔 센서이다. 

% Creep speed 는 그림 6과 같이 OPR method(여기에선 DOG방식)와 원점 간의 사이에 Speed를 조정하는 값이다.

% OPR direction 는 원점 복귀를 FLS방향으로 시작을 할것이냐, 아니면 RLS 방향으로 시작을 할 것이냐라는 이야기임. 위에선 DOG방식으로 하니깐 DOG방향으로 설정함 그래서 Reverse Direction으로 설정

% Retry OPR 는 FSL, RSL에서 한번더 원점을 찾을지 설정하는 것이다. 여기선 한번더 원점 찾는걸로 함.

 

----------------------------------------------------------------------------------------------------------------------------------

TEST

순서대로 누른다.

Select Function : JOG/Manual Pulse Generator /OPR 로 설정

JOG Speed : 300으로 설정

Forward RUN , Reverse RUN으로 서보모터 JOG 조정하면 끝.

ZWCAD를 사용합니다.

기본설정 : 새파일 ->zwcadio -> 열기 옆 미터법으로 설정

절대좌표 : 원점 0,0 기준으로부터의 좌표

상대극좌표 : 객체의 좌표로부터의 좌표(쓰는법 : @길이 <각도)

LINE : 선 만들기

ERASE : 객체 지우기

LIMITS : 용지설정 (A3 : (420 , 297) , A4 :  (297 , 210) )

ZOOM : 확대 화면 조정할때 쓰인다. ( zoom -> all )

CIRCLE : 원 만들기

OSNAP : 제도할 때 유용한 기능들을 설정할수있다.(끝점, 중간점, 중앙, 사분점, 연장, 교차점등)

BLIPMODE, REDRAW

OFFSET : 특정한 비율로 확대 및 축소

TRIM : 객체를 자른다

EXTEND : 다음위치까지 선을 연장한다

COPY : 객체를 복사한다

MOVE : 객체를 이동한다

PAN 

MIRROR : 대칭복사

UNDO : 한번만 취소

REDO

ARRAY : 객체 배열로 만들어서 나열함.

FILLET : 모깍기

CHAMFER : 모따기

SNAP

GRID

ELLIPSE(등각원사용법)

Zoom

Select Object

Break

Sketch

Polygon(정다각형)

Rectang(사각형)

Explode(분해)

Color

LineType

Ddchprop(속성)

Ltscale(중심선 또는 연속되지 않는 선들의 간격 조정)

Center

hidded(숨은선)

Layer(도면층), Matchprop(속성복사)

Arc(호)

Osanp(near 근처점, Per 수직점)

Scale(축척)

Rotate(회전)

Stretch(늘리기)

Dist(선의 길이를 알고싶을때)

List

Id(점 정보확인)

Area(객체정보확인)

Point(점)

DDptype(포인트 유형)

Divide(객체 등분)

Measure(길이 분할)

Osnap(Node)

Lengthen(길이 신축)

Pline(Polyline)

Pedit(Pline 편집)

Xline

Spline

Revcloud

Solid

Trace

Donut

Fill(ON/Off)

Regen

Champper

Fillet

BH(해칭)

Join(선들을 객체로 만드는 것)

Len -> DE -> 길이지정(선 길이 증가시키는 용도)

 

===========치수기입=====================

Dim : "치수 변수" 입력

DimScale -> 숫자 입력

Dim -> up

Dim -> upd

======치수변수========

Dim -> Hor(수평), Ver(수직), Ali(정렬), Ang(각도), Rad(반지름),Dia(지름),Leader(지시선)- 변수적용이 안됌/ 변수 Scale(축척),Dec(소수점자리),Up(적용을 시킴.)

DimTAD(치수선위로 문자올림)

DimTIH(치수선안에 문자를 치수선과 평행)

DimTOH(치수선밖에 문자를 치수선과 평행)

DimTIX(치수 보조선 밖의 문자를 치수 보조선안에 위치시킴)

DimTOFL(원,호에서 중심까지 이어주는 선을 표시)

DimTXT(문자의 크기 조정)

DimASZ(화살표의 크기 조정)

DimTSZ(화살표 이외의 티크( Tick:사선(/) 크기조정)

DimDLE(티크이었을 때 치수선 연장) - 화살표는 적용 안됌

DimEXO(객체와 치수보조선 사이의 간격을 조정)

DimBLK(화살표를 도트(●)으로 표시) - 원상태로 돌릴때는 "●"을 입력

DimCLRD(치수선의 색깔을 변경)

DimCLRE(치수보조선의 색깔을 변경)

DimCLRT(치수문자의 색깔을 변경)

DimTOL(공차사용 여부 결정)

DimTP(+ 공차값 입력)

DimTM(- 공차값 입력)

DimTDEC(공차문자 소수점자리 제어)

DimTFAC(공차문자의 크기 조절)

DimCEN(원의 "+"표시. 명령행에 DimCEN입력 후 "0"으로 셋팅)

 

-- 치수 이름 변경

ded -> N(신규) -> ctrl + enter -> 적용 시킬 치수 선택 -> enter 적용

-- 치수 간격 변경

dimspace -> 기준치수 하나 선택 -> 적용시킬 치수 선택 -> enter -> 간격 길이 설정

 

문자 쓸때 기호 넣기

%%d -> 각도(º) , %%p -> +-  , %%C -> 지름, %%%:% , \U+25A1 -> 정사각형(ㅁ)

 

CUI -> cad 사용자화 인터페이스

단축키 편집 express -> 도구 -> 명령어 편집기

 

 

 

 

 

'CAD' 카테고리의 다른 글

CAD OSNAP 주로 쓰는 것  (0) 2022.05.04

아래의 내용은 "GXworks2"로 작업하였습니다.

그림 1

필자는 그림을 못그립니다... 이해좀 해주세요ㅋㅋ 전구입니니다.

 

위의 그림1을 보면 PB1을 눌렀을 때 전구가 빨간색 -> 노란색 -> 파란색 -> 녹색 -> 보라색 순으로 켜보려고 합니다.

각각의 전구들이 1초간 켜지고 꺼지면 바로 다음 전구가 켜지고 마지막 전구가 켜지면 다시 첫 번째 전구를 켜는걸 할겁니다. 

PB2는 정지버튼 입니다. 전구가 커져 있으면 전구가 꺼집니다.

 

제어 회로입니다.

그림 2

▶ PB1을 누르면 M1을 켜고 M1을 자기유지 시킵니다. 1번 빨간 네모를 보시면 M1으로 T0(타이머0번)을 K10(1초)가 지난뒤 T0가 ON이 되면 D0에 1의 값을 더해 줍니다. (D0는 초기값이 0입니다.) 그리고 T0가 켜지면 T0의 자기 자신을 B접점을 두어 T0를 초기화 시키고 M1이 켜져있기 때문에 다시 타이머를 켭니다.

결국 1초 간격으로 한번식 끊어주고 다시 타이머를 돌리는 원리가 됩니다.

 

▶ 2번 빨간 네모를 보시면 M1이 켜졌을 때 비교연산자를 사용하여 D0의 들어간 값들이랑 비교를 하여 M10 ~ M 14까지 순서대로 켜주게 됩니다.  M10~M14는 임의로 준 값이며 여기에선 M10(빨간 램프) , M11(노란 램프) , M12(파란색 램프) , M13(녹색 램프) , M14(보라색 램프)로 보시면 되겠습니다. 마지막 줄을 보면 [> D0 K4] ----[MOVP K0 D0] 보입니다. 이것은 D0 > 4보다 크다면 D0에 0을 넣겠다는 것입니다. 

그 말은 D0가 5가 될 때 D0에 0을 넣는다는 말입니다.

결론은 4 -> 5가 될때 1초가 지난 뒤에 1을 더해 주니까, M14(보라색 램프) 동작이 끝나고 M10(빨간 램프)로 다시 켜주게 됩니다.

 

▶ 3번 빨간 네모는 PB2가 정지 버튼이므로 정지를 했을 때 처음부터 시작을 하려면 D0의 값을 0으로 바꿔줘야 됩니다. 그래서 넣었습니다.

 

※ 이쯤하면 만들 수 없을까? 라고 생각이 드실수도 있을겁니다. 물론 아닌분들도 있지만... 그래도 해봐야 느니깐 한번 생각 해보시기 바랍니다. 생각이 안난다 싶으면 위의 방법으로 변형을 한번 해보시기 바랍니다. 한 2가지 방법을 더 적겠습니다.

 

첫 번째 방법

그림 3

▶ 1번 빨간 네모칸은 T0를 K50(5초) 동안 타이머를 진행시킵니다. 

아래 줄에 [> T0 K0] - [< T0 K10] 둘다 ON이 되면 M10(빨간 램프)이 켜집니다.

이말인 즉, T0가 0~1초 동안 M10(빨간 램프)를 ON 시킨다는 말입니다. 나머지도 똑같습니다 

0 ~ 1초동안 -> M10 ON

1 ~ 2초동안 -> M11 ON

2 ~ 3초동안 -> M12 ON

3 ~ 4초동안 -> M13 ON

4 ~ 5초동안 -> M14 ON

 

두 번째 방법

그림 4

▶ 위의 방법은 D0의 시작점이 0의 값부터 시작 했는데, 이 방법은 1부터 합니다. 1번 빨간 네모칸을 보면 PB1을 눌렀을 시 D0에 1의 값을 넣습니다. 

이유가 있습니다. 밑에서 설명 하겠습니다.

2번 빨간 네모칸을 보면 ROL이라는 명령어가 있습니다.  여기서 쓰인 명령어는 ROL , SFR , SFL을 썼습니다. 이걸 한번 짚어보고 가겠습니다. 추가로 ROR도 설명 하겠습니다.

 

D 메모리 크기(16Bit)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

이렇게 표현을 할 수 있습니다. 2진수로 표현 됩니다. 저기 한칸 한칸이 1Bit입니다.

 

D메모리 안에 10진수 1을 넣어 보겠습니다.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

1을 2진수로 16Bit에 표현하면 위쪽처럼 됩니다. 

아까 D0에 10진수 1을 넣었으니 위와 같이 표현이 됩니다.

 

이때 , ROL K1을 하면

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

이렇게 됩니다. 설명을 하자면 "왼쪽으로 1 Bit 움직여라." 라는 뜻이다. 

 

특징은 아래와 같이 설명 하겠습니다.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

여기서 ROL K1을 하면 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

0자리에 1이 올라간다. 생각해보자. 15번째 자리랑 0번째 자리랑 원모양으로 이어져 있다고 생각하면 왼쪽으로 1Bit만큼 밀었다면 0번째 자리에 1이 올라간다고 생각할 수 있다. 그래서 ROL은 Roate of left 라고 생각하고 해석하면 왼쪽으로 회전 요렇게 생각하면 된다. 그래서 ROL K1을 다시 설명 하자면 "왼쪽으로 1Bit만큼 움직이고 회전할꺼 있으면 회전해라" 라는 뜻이된다.

나머지도 해석을 할 수 있다. "ROR(Rotate of Right) -> 오른쪽으로 Bit를 움직이고 회전해라." 라고 생각할 수 있다.

 

그럼 SFL,SFR은 뭘까? 이것도 똑같다 비트 수 만큼 움직이는 명령어다.  SFL -> Shift left , SFR -> Shift Right 뜻이다. 그럼 다른점은 뭘까? 아래를 보자.

 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

여기서 SFL K1을 하면

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

어떤가? 다 0이 된다. 아까는 회전해서 0번째 자리로 갔지만 이거는 옆으로 가면 아예 없어져 버린다. 

이정도 이해하면 된다. 더 알고 싶다면 C언어 중에 쉬프트 연산이있다. 그걸 참고하면 이해가 더 잘 될 것이다.

 

▶ 아까 위로 다시 가보면  3번 빨간 네모 칸에 D0.0 이 있습니다. 아까 위에서 봤듯이 D0의 메모리안에 0번째 자리를 쓴다는 이야기 입니다. D0.0가 A접점으로 쓰인걸로 보이죠? 네 맞습니다. 1Bit는 0 또는 1의 값을 가지는데 A접점으로 쓰고 D메모리에 0번째 자리에 1이 들어가면 커졌다고 생각할 수 있겠습니다. 그래서 D0.0이 켜지면 M10가 켜지고 ROL K1 한번식 Bit가 왼쪽으로 밀리면 D0.1, D0.2, D0.3... 요런식으로 커졌다 꺼졌다를 할 수 있습니다. 

4번 빨간 네모칸을 보면 SFR K5 오른쪽으로 밀었으니 다시 0번째 자리에 1이 있으므로 처음 상태값이 됩니다. 그래서 똑같은 결과가 됩니다.

5번 빨간 네모칸을 보면 SFL을 k15번 자리로 밀면 죄다 0의 값으로 채워지기 때문에 처음 아무것도 없는 상태가 되므로 [ MOVP K0 D0 ]와 똑같은 결과가 됩니다.

 

 

 

아래의 내용은 "GXworks2"로 작업하였습니다.

ST로 Counter의 기능을 만들어 보자.

user_Counter 펑션블록을 하나 만들었다.

user_Counter의 로컬 라벨들이다.

 

Counter의 로직이다.

bReset = true가 되면 cntCount = 0 이 된다.

input이 False면 return 시킨다.

bOnce = False면 bOnce = True로 바꿔주고 cntCount를 1증가 시킨다. bOnce의 조건을 준 이유는 한번만 증가 시키게 하기 위함이다.

결론 : input에 전기적 신호가 들어오면 카운터를 증가시키는 거다.

 

Function Block에서 Structure Ladder로 가져온 모습이다.

M0 가 켜지면 cntCount는 증가한다.

M1을 누르면 Reset 된다.

 

M0가 켜지면 cntCount가 1증가 했다.

M0를 4번 눌러서 cntCount가 4번 증가가 되었다.

M1을 누르면 bReset이 켜져서 cntCount가 0이 되었다. 잘된다.

아래의 내용은 "GXworks2"로 작업하였습니다.

 

ST로 Timer의 기능을 만들어 보자.

그림1

user_Timer 펑션블록을 하나 만들었다. 

로컬 라벨은 input 2개 output 2개로 만들었다.

 

Timer의 로직이다.

그림 2

input = true가 되기 전까지는 return으로 끝내서 return 이하의 문으로 진행이 안된다. 

input = true면 cntTime 을 100ms로 더해준다. 

만약 cntTime(현재진행시간) >= inputTime(입력된 시간) 보다 크다면 result(결과를 ) true로 반환한다.

 

Function Block에서 Structure Ladder로 가져온 모습이다.

M0 , M1은 임의로 준 내부 메모리다.

inputTime은 초기 설정값 즉, 3초만 되면 result가 true로 반환하는거다.

 

M0를 켜기전 상태이다.

M0를 눌러서 진행되는 상태이다.

3초가 완료되면 M1이 켜지는 모습이다. 잘된다.

+ Recent posts