'[ 충남인력개발원 ] (2019)/┗SCADA'에 해당되는 글 32건

싸이몬은 스크립트를 서밋 라이센스를 구매해서 만들었다

 

즉 버그가 많음

이렇게 함수를 제공하기 때문에 함수를 이용해서 사용하는 것이 좋다 

왜냐면 저거 보듣이 어떤건 가로가 안들어가고 

어떤건 가로가 들어가고 불편하게 되어있다

 

 

이렇게 쓰면 되긴하는데 

좀 불편함

 

RunScript("내가만든함수")

 

StopScript("내가만든함수")

 

명시적 선언은 

 

Dim 변수이름 [As타입] 이렇게 만들고

 

묵시적은 그냥 

변수 이름 이 선언되면 된다

 

정수형 

& : Long (4 Byte)

% : Integer (2Byte)

 

실수 

#: Double (8Byte)

! : Single (4Byte)

 

문자형

 $ 

 

변수 1% = 10

변수 1% = 20 

 

 

날짜 시간 

변수5 = Now 

 

 

문자형 

변수6 $ = "안녕하세요"

 

이건 변수로 못씀

1. Empty • 변수의 값을 초기화 되지 않은 상태로 만드는 키워드

2. IsEmpty • 변수가 초기화 되지 않았는지 확인하는 키워드

3. Nothing • 객체의 값을 초기화되지 않은 상태로 만드는 키워드 • 객체에 값이 있다면 시스템리소스를 해제하는 기능도 한다.

4. Is Nothing • 객체가 초기화되어 있는지 확인하는 키워드

5. Null • 변수가 유효하지 않은 데이터를 가진 상태로 만드는 키워드

6. IsNull • 값이 유효하지 않은 데이터를 가지는지 확인하는 키워드

7. True • 참인 경우의 Boolean 값을 가지는 키워드( 일반적으로 -1)

8. False • 거짓인 경우의 Boolean 값을 가지는 키워드(일반적으로 0 )

 

 

 

형변환

 

CStr :숫자를 문자로

숫자변수이름1$ = CStr("10.5")

 

Clnt: 문자를 숫자로

문자변수이름1%= Clnt("10.5")

 

기타

y1%= Year(Now())

년도 넣기 

 

1. + (더하기)

2. - (빼기)

3. * (곱하기)

4. / (나눈 후 몫)

5. Mod (나눈 후 나머지)

6. 기타 자주 사용되는 함수를 이용한 값의 계산

• Abs(변수) : 변수의 절대값을 계산하고 자 할 때 사용함

• Rnd() : 0 에서 1 사이의 범위를 가지는 임의의 실수 값

• ASC(변수) : 변수의 아스키 코드값을 계산하고 자 할 때 사용함

• Hex(변수) : 변수를 16진수 형태로 변환

• Oct(변수) : 변수를 8진수 형태로 변환

 

 

 

태그를 만들고 

이제 이걸 불러와보자 

 

 

변수1# = GetTagVal("뭔가한다.숫자") ----> 이거 뭔가한다 폴더안에 숫자라는 태그있어서 그런거임

MsgBox CStr(변수1#)


SetTagVal "뭔가한다.문자", "안녕하세요"   ---->이건 태그에 값넣는거 난 빼겟음 초기값넣어서
MsgBox CStr(GetTagVal("문자열태그"))

 

Get 성질을 띄는 내부함수는 괄호를 입력

● Get 성질을 띄는 내부 함수란, 특정 함수 A를 호출 했을 때 리턴 되는 어떤 값이 존재 한다면 그 함수는 Get 성질을 띤 함수이다

예) GetTagVal, TLogVal, CommStatus 함수 등

 

Set 성질을 띄는 내부함수는 괄호를 입력하지 않음

● Set 성질을 띄는 내부 함수란, 특정 함수 A를 호출 했을 때 리턴 되는 값은 없고 오로 지 특정 명령을 수행하는 함수라면 그 함수는 Set 성질을 띤 함수이다.

예) SetTagVal, OpenFileDlg, LoginEx 함수 등

 

 

 

 

이상한 애들의 약속

1. 연산식 혹은 명령식 괄호를 입력해야 함.

예를 들어, LoginEx(“userid”,”userpwd”)

 

2. 스크립트 함수 괄호를 입력하지 말아야 함.

예를 들어, LoginEx “userid”, ”userpwd”

 

 

왜이리 만든거야 귀찮게...

 

모든언어가 쓰는

if 와 select Case 는 다있음

 

Sub Main() 
   변수1# = GetTagVal("아날로그태그") 
   if 변수1# = 0 then
   	MsgBox "0입니다“
   elseif 변수1# = 1 Then 
	MsgBox “1입니다” 
   else 
	MsgBox "0, 1이 아닙니다"
   end if 
End Sub

 

 

위처럼 좀 end if 쳐야함 귀찮음

 

Sub 반복예제()
	합계 = 0
	for i = 0 to 10
		합계 = 합계 + i
	next i    //<-----여기 이거 i++같은거임
	MsgBox CStr(합계)
End Sub

 

 

 

for문은 또 end 안씀 이상함

 

Sub DigChange()
	While TRUE
		Sleep (1000)
		a = GetTagVal(“DIG1”)
		SetTagVal “DIG1”,1-a
	wEnd
End Sub
    
Sub AnaChange()
	While TRUE
		Sleep (2000)
		a = GetTagVal(“ANA1”)
		SetTagVal “ANA1”,a+1
	wEnd
End Sub

       while 은 또 wEnd로 줄여씀  break 같은거인가 아님 메모리 차지 없에는건가

 

 

 

 

Exit For 나간다 Break랑 같은듯

Sub 반복예제()
	합계 = 0
	for i = 0 to 10
		if 합계 > 30 then
			Exit For
		else
			합계 = 합계 + i
		end if
	next i
	MsgBox CStr(합계)
End Sub

계속보니깐  대충은 보임

 

 

 

Sub DigChange()
	While TRUE
		Sleep (1000)
		a = GetTagVal(“DIG1”)
		SetTagVal “DIG1”,1-a
	wEnd
End Sub
    
Sub AnaChange()
	While TRUE
		Sleep (2000)
		a = GetTagVal(“ANA1”)
		SetTagVal “ANA1”,a+1
	wEnd
End Sub

   

c언어를 많이 하다보니깐 이것도 좋은듯한 느낌도 있고

암튼 위에꺼 메인함수에 넣어주던가 어떻게 쓰면 될듯함

 

슬립도 여기서 하는거 똑같은듯 1000이 1초일듯함

 

이거 참고하면 좋을듯 

Sub 반복예제()
	합계 = 0
	for i = 0 to 10
		if 합계 > 30 then
			Exit For
		else
			합계 = 합계 + i
		end if
	next i
	MsgBox CStr(합계)
End Sub

 

Exit 예제인듯

 

 

 

Sub Word2Bit()
	worddata = GetTagVal("WORDDATA")
	BitMask = 1
	For i = 0 To 15
		tagstr$ = "BIT"+Format(i,"00")
		bitdata = worddata AND BitMask
		if(bitdata > 0) then
			SetTagVal tagstr$, 1
		else
			SetTagVal tagstr$, 0
		end if
		BitMask = BitMask * 2
	Next
End Sub

이건 

아날로그 쪼개기이다 

일단 해보자

 

 

블로그 이미지

Or71nH

,

태그의 고급설정이다

 

초기값은 처음 값을 말하고

DeadBand 는 딱딱 끊겨서 움직이는거 그러니깐 

1씩 안오르고 5씩 오르거나 100씩 오르게 할수 있음

 

내부데이터와 실데이터는 

내부값이 몇이여도 실데이터는  그범위의 퍼센트율로 숫자가 오름

 

 

Scale 이렇게 바꾸면 이제 공식을 게산하는거임

0.01 이렇게 넣으면 

내부 데이터가 10000 일때 실제 값은 100으로 되는거임

 

 

 

 

값이 오버됫을때 즉 int를 넘어간 범위가 되었을때  0으로초기화나 -로 되지않고 계속 올라가게함

 

그밑에 태그 동작은 이제 함수를 쓸수있다

이렇게 위에 더생기는데 

함수를 써서 마음데로 알고리즘을 사용할수있다 

 

 

 

네트워크 태그 동기화 거부는 

이테그는 연동되어도 따로 사용하겟다 그런거임

 

 

밑에는 한글 읽어보면 알 수 있다 

걍 읽어본다

 

보안등급을 설정하면ㅅ거 

이제 로그인 정보에 따라 작동의 권한을 부여할수 있다 

 

이렇게 새 작동자를 만들어 권한을 나누어서 로그인 하게 만든다

 

 

애니매이션은 많이 않넣는게 좋다

예가 램이 터져버린다 

 

멀티모니터도 있고

 

레시피 도 있는데 엑셀 파일를 사용 못하고 

RCT 라는 파일만 사용하게 해놔서 

불편함

 

여러가지 기능이 있다 

 

 

블로그 이미지

Or71nH

,

인버터가 뭐지?

 

 

전기세 계산방법 

1달 기준으로 

 

제일 높은 전력 사용량 즉 

일순간 전력 최대 사용량으로 계산하여 곱한다

 

평균적으로 사용하는 양으로 조절해야

즉 다나눠서 평균으로 조절해야 전기세가 낮다

슬슬 만들어간다 경보 센서 만들기

 

 

SV008 IG5A -2 ??? 이거 찾아보기?

 

 

지령주파수가 작동 명령하는것

지령!! 명령인듯

 

출력 주파수 값을 출력해주는것 

 

 

 

모두버스 설정해주고

 

모두버스 마스터 는 질의하는애 뭐야?? 값줘

 

모두버스 슬레이브 값을 전송해줄 수 있는에 

마스터한테 값 넘김 

 

scada 가 서버로 변해서 작동하는것임

 

시리얼로 하는것이 아니기 때문에 

컴터끼리 통신하니깐 TCP 로 열어준다

 

 

 

 

저거 전체복사하면 엑셀에 넣을수 있다

 

 

 

스크립드

 

 

함수는 F1로 도움말 쓰자

 

뭔가 썻다

함수는 도움말을 이용하여 물어보고 

 

저건 C# 인듯한데 세미콜론은 빼도 가능하다고 한다

 

 

 

그다음 경보에 

동작넣어야 하는데 이거 모르겟네 

 

 

 

 

 

 

 

 

태그를 이렇게 해줫음 COMM_A 은 연결 네트워크 알람

 

RunScript("Comm_st") OpenPage("alam.PGX") 경보 발생 함수는 이렇게 해 줫음 

 

내부 함수 뒤지다 보면 나옴

 

함수를 찾아야함

 

 

일단 숙제 

 

1. 보고서 출력자료 캡쳐

 - 보고서 엑셀로 출력시 사용하는 함수명과 뜻을 쓰시요.

 

2. 모드버스 마스터와 슬레이브에 대해 쓰시오

- 0134 세부 식별자에 대한 설명작성

- 인버터 어드레스를 캡쳐하시오.

 

 

 

일단 데이터는 옴기기됫음

일단 테그 만들어주고 저거 구조 다만들어준다 

수량 조절 가능하게 만들어주고 

 

 

저거 보고서 보낼때 쓸 디지털 버튼도 만들어준다

 

이렇게 누르면 동작하게 다만들었고

물탱크 시간마다 만들어주는거 만들기

 

함수는 TLogVal("물탱크.물탱크1", "0일 0시", "순간값")

   이러면 Time 시간  Log 읽어온다 Vallue 값을 

이런놈 하나넣고 

  처음은 값읽어올 "태그(데이터)" 와 2번째는 "시간 (0일이 오늘기준임) "   지금이순간?? "순간값"

이렇게 넣어주면됨

 

 

 

보고서 만들자

 

저기있는 보고서 양식이 배경을 어떻게 할거냐 이다 그러니 배경 하나 만들어줘야지

이따구로 만들어주고 우린 값을 C5셀부터 넣어야함!!!

 

이렇게 만들면 된다 태그등록 에서 cell 추가해서 반복입력 쫙긁어주면 쫜

저기서 C5 해야되는데 오타있다

 

잘못 쳣네 어쩐지 줄 밀리더라

 

 

이러고 실행하면 끝

출력방법은 저거 위치에 저장하겟단거임

 

 

모드버스 마스터 슬레브 는 위에 썻는데 다시쓴다

 

 

이렇게 슬레브를 만들이제 노예가 되는것이다 데이터의 노예 

계속 줘야하는 일많은넘이되고

 

이렇게 마스터가되면 

슬레브한테(노예)한테 데이터의값 물어보면 값을 받아올수있다 

 

역시 마스터는 가져오는애

슬레브는 주는애 

 

이거 할때는 SCADA 가 컴터끼리 통신이라 

TCP 로 하고 

그 기계 뭐라부르냐 암튼 기계에 할떄는 시리얼 번호 가 있으니 

RTU로 한다

 

여기 매뉴얼이있을거다

 

iG5A_완전본_Kor_160812.pdf
5.25MB

이 완전본이 모든것을 알려줄것이다

 

 

별별 글이 다있지만  다필요없이 숫자만 찾자

됫어 이거면됨 ㅇ

걍 위에서부터 RTU 40001 = A101 이다 즉 A1 는 4 뒤번호는 뒷번호 뭐

0 디지털값 R/W

1 디지털값 R

3 아날로그값 R

4 아날로그 값 R/W 

차이는 다들 알것이고

 

그럼 잘 불러오면됨 ㅇㅇ 끝 

블로그 이미지

Or71nH

,

1문제 

 

- XGB 프로토콜을 이용해서 받아온 데이터를 모드버스로 받아오시오 !!

 

 

일단 만듬

 

 

필요한건

산전 plc 를 쓰니깐 다운해야함

저거받아서 실행하면

이런게 생김

저기잇는 기본 네트워크에 NEW PLC를 클릭해 들어와준다 

PLC 로부터 열기 해서 PLC 주소를 입력해줌

모드버스 설정은 이걸로 해준다

첫번째가 bit R

두번째가 bit R/W

세번째가 word R

네번째가 word R/W

근데 숫자는 좀애매함

 

 

0 bit R/W

1 bit R

3 word R

4 word R/W

이리되어있음

불러올땐 

참고하면됨 

 

왠만하면 워드 읽기도 

이거에 맞쳐서해준다 

 

 

 

난 192.168.0.100 이엿음 뭐 다들 다를듯

 

 

다음 접속 설정에서 모두버스로 바꿈

 

 

여기도 대충 그림그려주고

 

 

modicon modbus tcp 만들고

 

스테이션

ip설정후

어드레스 는 그냥 통신하는 사람들 약속으로 함 

 

상관없지만 

첫번째가 비트 짧은거 읽기/쓰기 (R/W)

두번째가 비트 짧은거 읽기 (R)

세번쩨가 word 긴 글자 읽기 쓰기 (R/W)

내번쩨가 Word 긴 글자 읽기 (R)

 

이식으로 보내기로 약속한듯

지킬필요없음

보낼때 어떻게 보내는야 에 따라서 설정하면됨

데이터 베이스 만들어주고

실테그로 잘만들어줌

 

그럼 끝

 

테그한거랑 맞게 설정하고 실행하면됨

블로그 이미지

Or71nH

,

 

파일의 새프로젝드를 실행해보자

이름은 이렇게 만들었다

 

페이지도 만들자

 

파일에 있움

 

 

 

 

컴퓨터들의 제 2 언어 모디콘(모두스)의 TCP 로 작업을 시작하겟다 

 

장치의 정보 스테이션입니다

 

이것은 내정보임

0.0.0.0.  <--- 이것은 내ip를 불러오는 툴이 있어서 이렇게하면 컴터 바껴도 ip 알아서 맞쳐서 불러옴

 

 

 

여기 스테이션 추가 하면 이리뜸

 

통신 블록은 

어드레스는 40001 부터 읽겟고

데이터수는 몇개 읽을지 정하는것

 

태그편집을 들어가보자

 

태그를 만들어주고 

저거누르면 

 

이렇게 만들수있음 돋보기 있으면 만든거 볼수있음

됫움

예가 예임

통신 끝~

블로그 이미지

Or71nH

,