[제품종류] IEC1000
[개발환경] Visual Studio 2008 C#
=============== 질 문 ===============귀사의 제품으로 이용하여 RS485통신으로 모터제어를 구현하고 있습니다.
단일 동작은 잘 구현되어 제어하고 있는데, 최종적으로 구현하고 싶은 건 단일동작 여러개를 헙쳐 하나의 시퀀스를 만들고 싶습니다.
1. 명령어 전송
2. 첫번째 동작 완료까지 상태 체크하면서 작업대기 / 동작완료 Flag 수신 시 대기 작업 종료
3. 2번 완료 시 두번째 동작 명령어 전송
4. 두번째 동작 완료까지 상태체크하면서 작업대기 / 동작완료 Flag 수신 시 대기 작업 종료
5. ...
이런식으로 구현하고자 하는데, SmartTimer를 사용하니 작업대기를 건너뛰고 2번째 동작명령이 송신되어 버립니다.
SmartThread를 사용하면 작업대기는 가능한데, 여러개의 단일 동작을 이어 붙이는걸 어떻게 구현해야할지 잘 모르겠습니다.
또한, 이런 시퀀스를 동시에 2~3개 동작시킬려면 어떤 방식이 IEC1000에서 효율적인지 아이디어를 좀 얻을 수 있을까요??
=============== 답 변 ===============
안녕하세요
먼저 IEC-Series의 485 포트는 물리적으로 1Ch만 존재하여, 1:N 구조의 통신시 입력되는 포트로
Slave 장비를 구별할 수 없으므로 SlaveAddress를 통해 Slave장비를 구별하게 됩니다.
따라서 SlaveAddress를 구분하도록 Protocol에 포함 되어 있어야 하며 이 SlaveAddress로
특정 Slave 장비의 Request / Response 작업을 할 수 있도록 프로그램 하셔야 합니다.
질문에서 작업대기를 건너뛰고 2번째 동작명령이 송신되는 현상이 발생한다고 하셨는데,
다른 시퀀스에서 해당 SlaveAddress에 접근하는지 확인해보셔야 할 것 같습니다.
작성하신 내용만으로는 이해가 어려우므로 코드를 같이 보내주시면 문제를 정확하게 파악하는데
도움이 될거 같습니다 .
[이메일 주소] app@smartx.co.kr
[전화]070-7094-5002(S/W담당)
감사합니다
=============== 답 변 ===============
답변 감사합니다.
첨부와 같이 작성하고 있는 프로젝트 파일을 송부합니다.
타이머로는 원하는 동작이 안되는 것 같아 아래와 같이 SmartThread로 작성해봤습니다.
다만, 구현방식이 너무 무식한(?) 방법인 듯하여 좀 더 효율적인 방식이 있는지 문의 드립니다.
그리고 버튼 하나가 더 있어서 다른 모터를 제어했으면 합니다.
제가 작성한 하나의 모터를 구동하는 코드는 Thread를 2개로 돌린다 하더라도 모터 상태를 체크하는 부분에서 문제가 생길 것 같습니다.
SlaveAddress는 코드 내 CmdSend("00 34 ... 부분의 00입니다.
첨부파일에 보시면 SlaveAddress 00 | 02 이렇게 2개의 모터가 있습니다.
감사합니다.
private void Btn_SendData1_Click(object sender, EventArgs e)
{
Btn_SendData1.ButtonColor = Color.Green;
Btn_SendData1.Enabled = false;
EziServo_CmdSend("00 34 C0 D4 01 00 80 38 01 00"); // Position: 120,000 | Speed: 80,000
m_iServo1_StepNo = 2;
sThread_Servo1.Start();
}
private void sThread_Servo1_UIThreadFunction(SmartX.ThreadArgs args)
{
m_bRecvData1 = EziServo_CmdSend("00 40"); // Check Servo Motor State
// Delay(50);
m_bFrameData1 = m_bRecvData1.Skip(5).Take(4).Reverse().ToArray();
if ((m_bFrameData1[0] & 0x08) != 0x08)
sThread_Servo1.End();
}
private void sThread_Servo1_OnEnding(SmartX.ThreadArgs args)
{
if (m_iServo1_StepNo == 2)
{
EziServo_CmdSend("00 34 F0 49 02 00 10 27 00 00"); // Position: 150,000 | Speed: 10,000
//Delay(100);
m_iServo1_StepNo = 3;
sThread_Servo1.Start();
}
else if (m_iServo1_StepNo == 3)
{
EziServo_CmdSend("00 34 C0 D4 01 00 10 27 00 00"); // Position: 120,000 | Speed: 10,000
//Delay(100);
m_iServo1_StepNo = 4;
sThread_Servo1.Start();
}
else if (m_iServo1_StepNo == 4)
{
EziServo_CmdSend("00 34 10 27 00 00 80 38 01 00"); // Position: 10,000 | Speed: 80,000
//Delay(100);
m_iServo1_StepNo = 5;
sThread_Servo1.Start();
}
else if (m_iServo1_StepNo == 5)
{
Btn_SendData1.ButtonColor = Color.LightGray;
Btn_SendData1.Enabled = true;
}
}
=============== 답 변 ===============
안녕하세요
Thread는 작업의 병렬 처리를 위한 컴포넌트입니다.
이는 여러 포트의 작업을 처리할 때 유용한 기능으로,
COM1 포트를 제어할 때 여러 쓰레드에서 COM1에 접근하게 되면 그림처럼
특정 쓰레드에서 요청한 데이터를 다른 쓰레드에서 접근하여 수신하는 상황이
발생할 수 있습니다.
따라서 질문자님이 구현하고자 하는 작업은 쓰레드 하나를 사용하되,
각 작업을 펑션으로 구분하여 순차적으로 실행되도록 프로그램을 구현하시는게
맞다고 판단됩니다.
연락처를 남겨주시거나 하단의 번호로 연락주시면 문제를 정확하게 파악하는데
도움이 될거 같습니다 .
[이메일 주소] app@smartx.co.kr
[전화]070-7094-5002(S/W담당)
감사합니다