퇴근5분전

 카테고리 정리를 한번 해야 하려나....  

 

이번 플젝 하나를 하게 되었다. 지인분 회사에서 LG산전 PLC...를 HMI가 아닌 웹페이지에서 모니터링 하고 싶어하신다. 

MES할때 봤던 PLC를... 15년? 16년만에 보는건가? 

 

모드버스TCP로 통신하는 걸로 해서 8일날 PLC를 받고 벌써 일주일이 되었구나... 

어쨌든... 오늘 오전 드디어 샘플로 작성되어 있는 PLC 레지스터 정보를 읽어내고 쓰는데 성공했다. 

주말2일, 하루는 어머니 병원다녀오고...  딱 3일 걸렸다. 

%MW0, %MW100, %MX160, %MX0  주소가 이렇게 되어 있는 걸 값을 읽어야 하는데...

공부를 2일동안했다. PLC 주소체계랑, 모드버스TPC 통신 프로토콜...

 초반에 LG산전 PLC통신 치면 XGT서버와 통신하는 것들이 나와서... 헤매고... 

 

기본적으로 메모리 주소체계.

그리고 모드버스TCP통신 프로토콜에 대한 이해.

 

LG산전 PLC 메모리 주소체계 설명.

https://www.youtube.com/watch?v=BE5WZYjT8ZA

 

http://comfilewiki.co.kr/ko/doku.php?id=tcpport:modbus-tcp_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%B4%EB%9E%80:index

 

tcpport:modbus-tcp_프로토콜이란:index [Comfile Technology's Online Documentation]

MODBUS-TCP란 MODBUS-TCP는 산업용 필드버스 분야에서 자주 사용되는 통신 프로토콜 입니다. TCP/IP 네트워크 상에서 상위장치와 하위장치간의 인터페이스를 위하여 고안된 통신방법입니다. MODBUS-TCP 통

comfilewiki.co.kr

 

http://comfilewiki.co.kr/ko/doku.php?id=tcpport:funtion_code%EB%B3%84_data_%EA%B5%AC%EC%A1%B0_%EB%B0%8F_%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4_%EC%A0%9C%EC%96%B4:index

 

tcpport:funtion_code별_data_구조_및_디바이스_제어:index [Comfile Technology's Online Documentation]

Funtion Code별 DATA 구조 및 디바이스 제어 MODBUS-TCP는 Function Code별 프로토콜 Data구조가 조금식 달라집니다. Function Code별로 요청·응답에 대한 프로토콜의 데이터 구조를 알아보고 TCPPORT의 디바이스

comfilewiki.co.kr

 

그리고 마지막으로... 

https://www.youtube.com/watch?v=O580kTtpfNI

 

가끔 C#으로 이런저런거 하는 건 봤는데... 

엄청나게 도움이 된다. 이걸 보려면... 주소체계나 프로토콜 이해가 필요하니...

순서에 상관없이 꼭 시청하면 될 듯 하다. 

 

30일까지 프로젝트를 마무리 해야 해서... 내일부터는 라이브러리 코드 정리하고... 

윈도우서비스로 데이타 수집하는 프로세스 만들고, 웹서비스로 모니터링한 데이타 뿌려주는걸.... 보름안에 해야 한다. 

오늘 통신이 되어서 뭔가? 안도감이??? 나머진 쉬운거니까... 

잘 구성해서... 1년에 두세개 정도 나온다니.. +_+;;;  밥값은 벌 수 있겠당.

 공통 UI쪽 관련해서 조금 만지는 부분이 있는데... 

코드를 아래와 같이 쓸수 있으면 어떨까? 라는 생각을 해봤다. 

  Call()( msg => msg( "x" ) );

 

Call() 호출하고 이어서 대리자로 연결된 메서드에 파라미터를 받아서 전달!!

 

UI를 다루면서 두가지 처리를 연속적으로 하게 되는 거였다. 

UseFlowBodyPanel();

foreach( var data in ListDatas ) {

     AddFlowBodyItem( data );

}

이런 식으로 처리하는 걸... 줄여서 

UseFlowBodyPanel()( AddFlowBodyItem => foreach( var data in ListDatas ) AddFlowBodyItem( data ) );

 

실제 코드는 여러가지 조건들을 고려해서 조금 바뀌지만...위 처럼 갈 것이다. 

 

다만 Call()은 테스트 코드로 작성했던것이기에... 기록으로 남겨두려 한다. 

 private Action<Action<Action<string>>> Call()

        {

            System.Diagnostics.Debug.WriteLine("Call!");

            Action<Action<Action<string>>> returnMethodCall

              = new Action<Action<Action<string>>>((msg)=> msg( Call_After ));            

            return returnMethodCall;

        }

 

        private void Call_After(string msg)

        {

            System.Diagnostics.Debug.WriteLine("Call_After!" + msg);

        }

 

Action<string> 은 Call_After( string msg )와 연결되는 게 기본이니까 알겠는데... 

 

연결지으려면 왜 Action<Action<...>> 으로 두개가 필요한건지는 잘 모르겠네... 

 

찾는 방법은 Call() (  <-- 이렇게 코딩해놓고 vs에 표시되는 인자값이 Action<string> 인지 확인하였더니 

Action<Action<...>> 이었다. 

 

Action  mth = s => console.Write( s ); 이런 형태로 Action이 빠지니까.. 

Call() 에서 리턴받은 object가 Action< Action < Action<string> > >

인데... 

Action이 하나 빠지고 

msg => msg( "x" ) 

msg는 Action<string> 이니까... 

Action<Action<string>> 을 정의한거고... 

.... 뭐래는겨......... 모르겠다 ㅠㅠ. 

머리속에 맞춰지지 않는 퍼즐이 있는 것 같은 느낌... 아.. 싫어.. 

 

Action<Action<string>> mth1 = mthCall => mthCall("?");
mth1(Call_After);

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

Action대신 Method로 바꿔 생각해보면... 

 

Action< Action< Action<string > > >
Mth0(   Mth1(    Mth( string ) ) )
Mth0(   Mth1(    MethodName    ) )

Call()(  MethodName => MethodName( prms ) );

Action<string>  
   mth( string => string )

Action< Action<string > >
   mth1(   MethodName => MethodName( str )  )

Action< Action< Action<string > > >
   mth0(   mm =>  mm( MethodName ) )

 

Action<Action<Action<string>>> returnMethodCall

              = new Action<Action<Action<string>>>((msg)=> msg( Call_After ));            

 ----->    (msg)=> msg( Call_After )

 

이거 때문에 잠도 못잤네. 

Call() (   여기에서 왜? mth0이 사라지고 mth1이 대입되는거지??? ) : 두개가 벗겨지네...

 

 

Action<Action<Action<string>>> returnMethodCall = Call();
returnMethodCall( msg => msg("???") );

음... 실제 리턴받은걸 실행해보면... 위처럼 되네...? 

어라... 뭐지? 

 

Action<Action<Action<string>>> returnMethodCall

              = new Action<Action<Action<string>>>((msg)=> msg( Call_After ));     

 

returnMethodCall(   이자리는  Action<Action<string>>  타입이 들어와야 하니.. m => m("?") ); 

아... 이랬던가? 

new로 대상을 지정하는 람다식과 대리자를 호출하는 부분에 차이때문에 내가 헷갈린건가... 

아무렇지도 않게 사용하던거에... 정신이 나가버릴것 같네... 이제 이해가 된다... 

POE] 게임... 필터..

--- 취미2023. 10. 11. 22:57

필터부분 수정 후 테스트.. 

- 네버싱크

  : 정의의화염 초반 셉터, 모든화염젬렙, 모든주문젬렙, 물리주문젬(신성한 화염 토템에 적용)등 가진 셉터가

떨어지면 필터에 걸리도록 수정, 또는 5렙에 사용하는 흑단목 셉터를 필터로 잡는다. (변옵돌리려고...)

  : 헬멧에 혹시 정의의 화염 인챈트 된 것! ( 거의 볼일은 없겠지만... )

 

아이템 필터 랭킹 ( https://poe.game.daum.net/item-filter/ladder/follower )  에서

네버싱크 클릭하면 아래처럼 나온다 [복사] 클릭하면 

필터명을 바꾸고... 

# [[0100]] Global overriding rules 부터... 아래 내용으로 채워넣는다.. 그후 아래 [제출하기] 를 클릭한다.

 

 

아래처럼 저장이 된다.

게임내 필터로 지정하고 떨궈보면... 아래처럼 보인다.. ( 소리는 쉽게 구분 가능한 소리로... )

 

 초반 액트 1에 물에잠긴길에서 흑단목 셉터가 떨어지면...

이 셉터에 변옵 돌려서 모든 물리, 화염, 주문 젬 레벨 +1 을 띄우면 .. 액트 밀기 좋다.

음.. 모든 셉터를 잡을까? (액트 진행중에 셉터는 계속 진화의 오브를 던져야 하니...:화염젬레벨뽑기)

 

# [[0100]] Global overriding rules

################################################### js RF START
# 흑단목 셉터 ( 물리, 모든, 화염 젬 레벨 + 1 표시 )
Show # $type->magicid $tier-> RF
Mirrored False
Rarity Normal Magic Rare
Class == "Sceptres"
Identified True
Corrupted False
HasExplicitMod >=1 "달인의" "화염 형성자의" "석마술사의" #모든젬, 화염젬, 물리젬+1
SetFontSize 45
SetTextColor 255 255 255 255
SetBorderColor 255 255 255 255
SetBackgroundColor 0 20 180 255
PlayAlertSound 1 300
PlayEffect Red
MinimapIcon 0 Red Star

Show # $type->magicid $tier-> RF
Mirrored False
Rarity Normal Magic Rare
Class == "Sceptres"
BaseType == "흑단목 셉터"
Corrupted False
SetTextColor 255 255 255 255
SetBorderColor 255 255 255 255
SetBackgroundColor 0 20 180 255
PlayAlertSound 2 300
PlayEffect Blue
MinimapIcon 0 Blue Triangle

Show # $type->magicid $tier-> 방패
Mirrored False
Rarity Normal Magic Rare
Class == "Shields"
Identified True
Corrupted False
HasExplicitMod >=1 "엄벌가의" "달인의" "화염 형성자의" "석마술사의" #소환수젬, 모든젬, 화염젬, 물리젬 +1
SetFontSize 45
SetTextColor 255 255 255 255
SetBorderColor 255 255 255 255
SetBackgroundColor 0 20 180 255
PlayAlertSound 1 300
PlayEffect Red
MinimapIcon 0 Red Star

# 인챈트 정의의 화염
Show # $type->rareid $tier-> 인챈트
Rarity Rare
Class == "Helmets"
AnyEnchantment True #인챈트 된 것
HasEnchantment "Enchantment Righteous Fire Damage 1" "Enchantment Righteous Fire Damage 2" "Enchantment Righteous Fire Area Of Effect 2" 
SetFontSize 45
SetTextColor 0 240 190 255
SetBorderColor 0 240 190 255
SetBackgroundColor 47 0 74 255
PlayAlertSound 1 300
PlayEffect Purple
MinimapIcon 1 Purple Diamond

# 사운드 PlayAlertSound {1-6} 300
# 1 - 환영오브 떨어지는 소리..., 행운아(x신성2) 같은 카드 소리
# 2 - 카오스, 연금...
# 3 - 고유 
# 4 - 지도 흰맵, 노랑
# 5 - 지도 빨맵
# 6 - 디바인

#디바인 떨어졌을때 ( 흰바탕, 빨간글씨, 빨간 테투리 )
# SetFontSize 45
# SetTextColor 255 0 0 255
# SetBorderColor 255 0 0 255
# SetBackgroundColor 255 255 255 255
# PlayAlertSound 6 300
# PlayEffect Red
# MinimapIcon 0 Red Star


#카드중 '행운아' 떨어졌을때 ( 파란 바탕의 흰글씨, 흰색 테두리 )
SetFontSize 45
SetTextColor 255 255 255 255
SetBorderColor 255 255 255 255
SetBackgroundColor 0 20 180 255
PlayAlertSound 1 300
PlayEffect Red
MinimapIcon 0 Red Triangle

################################################### js RF END