'[ 충남인력개발원 ] (2019) > ┗PLC' 카테고리의 다른 글
씨리얼 통신 RS232 (0) | 2020.01.10 |
---|---|
온도 센서만들어서 통신해보기 (0) | 2020.01.06 |
전기 공구세트신기한거 받음 (0) | 2020.01.06 |
TEMCOLINE 강제 센서 만들기 (0) | 2020.01.02 |
통신의 문제 (0) | 2020.01.02 |
씨리얼 통신 RS232 (0) | 2020.01.10 |
---|---|
온도 센서만들어서 통신해보기 (0) | 2020.01.06 |
전기 공구세트신기한거 받음 (0) | 2020.01.06 |
TEMCOLINE 강제 센서 만들기 (0) | 2020.01.02 |
통신의 문제 (0) | 2020.01.02 |
윈도우 임베이디드 용 E
델타 시스템 사용유무
제트펄스
AB
실행 되어있음.
https://hpoption.tistory.com/201
코드 사용하기
http://www.hardcopyworld.com/ngine/aduino/index.php/archives/3369
활용 예제
이제 사용법을 사용해보자
이렇게 쓰면 된다
6일차 C#과 ModBus (0) | 2020.04.13 |
---|---|
4일차 Fuction 3 코드 해석 (0) | 2020.04.09 |
3일차 코드 모두버스의 대하여 (0) | 2020.04.08 |
2일차 코드?? (0) | 2020.04.07 |
1일차 C# 윈폼 EXCEL 데이터 컴파일 (0) | 2020.02.24 |
### 멀티 쓰레드
private object obj = new object();
lock (obj)
{
}
system.threading.monitor.Enter( obj)
try{
} finally {
system.threading.Monitor.Exit(obj);
}
### 사용예 쓰레드 사용하기 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp3
{
// 다수의 스레드가 하나의 객체를 사용하는 경우
class ThisLock
{
public void IncreaseCount(ref int count)
{
count++;
}
}
class Test
{
ThisLock lockObject = new ThisLock();
int Count = 0;
public void ThreadProc()
{
lock (lockObject) // <-- object형으로 처리해도 결과는 동일하다.
{
for (int i = 0; i < 10; i++)
{
lockObject.IncreaseCount(ref Count);
Console.WriteLine("Thread ID: {0} result: {1}", Thread.CurrentThread.GetHashCode(), Count);
}
}
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++)
{
threads[i] = new Thread(new ThreadStart(test.ThreadProc));
}
for (int i = 0; i < 3; i++)
{
threads[i].Start();
}
}
}
}
### 모니터 사용하기 lockr과 차이가 없음
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp6
{
// 다수의 스레드가 하나의 객체를 사용하는 경우
class Test
{
int Count;
object obj = new object();
public void IncreaseCount()
{
Monitor.Enter(obj);
for (int i = 0; i < 5; i++)
{
Count++;
Console.WriteLine("Thread Id: {0} Count: {1}", Thread.CurrentThread.GetHashCode(), Count);
}
Monitor.Exit(obj);
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
Thread th1 = new Thread(new ThreadStart(test.IncreaseCount));
Thread th2 = new Thread(new ThreadStart(test.IncreaseCount));
th1.Start();
th2.Start();
}
}
}
### lock 같이쓰기?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp7
{
// 다수의 스레드가 하나의 객체를 사용하는 경우
class ThisLock
{
public void IncreaseCount(ref int count)
{
count++;
}
}
class Test
{
ThisLock lockObject = new ThisLock();
public int Count = 0;
public void ThreadProc()
{
Monitor.Enter(lockObject);
for (int i = 0; i < 10; i++)
{
lockObject.IncreaseCount(ref Count);
Console.WriteLine("Thread ID: {0} result: {1}", Thread.CurrentThread.GetHashCode(), Count);
}
Monitor.Exit(lockObject);
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++)
{
threads[i] = new Thread(new ThreadStart(test.ThreadProc));
}
for (int i = 0; i < 3; i++)
{
threads[i].Start();
}
}
}
}
### mutex 쓰레드 사용하기
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp7
{
// 다수의 스레드가 하나의 객체를 사용하는 경우
class ThisLock
{
public void IncreaseCount(ref int count)
{
count++;
}
}
class Test
{
ThisLock lockObject = new ThisLock();
public int Count = 0;
public void ThreadProc()
{
Monitor.Enter(lockObject);
for (int i = 0; i < 10; i++)
{
lockObject.IncreaseCount(ref Count);
Console.WriteLine("Thread ID: {0} result: {1}", Thread.CurrentThread.GetHashCode(), Count);
}
Monitor.Exit(lockObject);
}
}
// Mutex를 메서드에 적용한 예
class Program
{
static Mutex mut = new Mutex();
static int Count;
static void ThreadProc()
{
mut.WaitOne();
for (int i = 0; i < 5; i++)
{
Count++;
Console.WriteLine("Tread ID: {0} Count: {1}", Thread.CurrentThread.GetHashCode(), Count);
}
mut.ReleaseMutex();
}
static void Main(string[] args)
{
Test test = new Test();
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++)
{
threads[i] = new Thread(new ThreadStart(test.ThreadProc));
}
for (int i = 0; i < 3; i++)
{
threads[i].Start();
}
}
}
}
### Mutex를 이용한 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp9
{
// 다수의 스레드가 하나의 객체를 사용하는 경우
class ThisLock
{
public void IncreaseCount(ref int count)
{
count++;
}
}
class Test
{
ThisLock lockObject = new ThisLock();
Mutex mut = new Mutex();
public int Count = 0;
public void ThreadProc()
{
mut.WaitOne();
for (int i = 0; i < 10; i++)
{
lockObject.IncreaseCount(ref Count);
Console.WriteLine("Thread ID: {0} result: {1}", Thread.CurrentThread.GetHashCode(), Count);
}
mut.ReleaseMutex();
}
}
// Mutex를 메서드에 적용한 예
class Program
{
static Mutex mut = new Mutex();
static int Count;
static void ThreadProc()
{
mut.WaitOne();
for (int i = 0; i < 5; i++)
{
Count++;
Console.WriteLine("Tread ID: {0} Count: {1}", Thread.CurrentThread.GetHashCode(), Count);
}
mut.ReleaseMutex();
}
static void Main(string[] args)
{
Test test = new Test();
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++)
{
threads[i] = new Thread(new ThreadStart(test.ThreadProc));
}
for (int i = 0; i < 3; i++)
{
threads[i].Start();
}
}
}
}
8일차 모스키토 사용 (0) | 2020.04.16 |
---|---|
4일차 Fuction 3 코드 해석 (0) | 2020.04.09 |
3일차 코드 모두버스의 대하여 (0) | 2020.04.08 |
2일차 코드?? (0) | 2020.04.07 |
1일차 C# 윈폼 EXCEL 데이터 컴파일 (0) | 2020.02.24 |
#region Function 3 - Read Registers
public bool SendFc3(byte address, ushort start, ushort registers, ref short[] values)
{
//Ensure port is open:
if (serialPort.IsOpen)
{
//Clear in/out buffers:
serialPort.DiscardOutBuffer();
serialPort.DiscardInBuffer();
//Function 3 request is always 8 bytes:
if (MyGlobals.serial_mode == MyGlobals.MODBUS_RTU)
{
byte[] message = new byte[1 + 1 + 2 + 2 + 2];
byte[] response = new byte[1 + 1 + 1 + (2 * registers) + 2];
//Build outgoing modbus message:
BuildMessage(address, (byte)3, start, registers, ref message);
try
{
serialPort.Write(message, 0, message.Length);
GetResponse(ref response);
}
catch (Exception err)
{
modbusStatus = "Error in read event: " + err.Message;
return false;
}
if (CheckResponse(response))
{
//Return requested register values:
for (int i = 0; i < (response.Length - 5) / 2; i++)
{
values[i] = response[2 * i + 3];
values[i] <<= 8;
values[i] += response[2 * i + 4];
}
modbusStatus = "Read successful";
return true;
}
else
{
modbusStatus = "CRC error";
return false;
}
}
else
{
modbusStatus = "CRC error";
return false;
}
}
else
{
modbusStatus = "Serial port not open";
return false;
}
}
#endregion
여기선 사전 검사 를 하는거라고 생각하면 된다
사이즈를 만들고 이제 밑에 빌드 메세지로 간다
#region Build Message
public void BuildMessage(byte address, byte type, ushort start, ushort registers, ref byte[] message)
{
//Array to receive CRC bytes:
byte[] CRC = new byte[2];
byte[] message2 = new byte[20];
message2 = null;
if (MyGlobals.serial_mode == MyGlobals.MODBUS_RTU)
{
message[0] = address;
message[1] = type;
message[2] = (byte)(start >> 8);
message[3] = (byte)start;
message[4] = (byte)(registers >> 8);
message[5] = (byte)registers;
GetCRC(message, ref CRC);
message[message.Length - 2] = CRC[0];
message[message.Length - 1] = CRC[1];
}
else //Ascii - FC3
{
}
send_message = null;
for (int i = 0; i < message.Length; i++)
{
send_message += message[i] + " ";
}
//send_message+= null;
}
#endregion
빈 메세지를 받고 기에 값을 넣기 시작한다
8일차 모스키토 사용 (0) | 2020.04.16 |
---|---|
6일차 C#과 ModBus (0) | 2020.04.13 |
3일차 코드 모두버스의 대하여 (0) | 2020.04.08 |
2일차 코드?? (0) | 2020.04.07 |
1일차 C# 윈폼 EXCEL 데이터 컴파일 (0) | 2020.02.24 |
모두버스 코드의 생성방법
모두버스 메모리의
Coils 그니깐 출력값
Holding Register 붙잡고 계속 받는거
Input Register 들어온 데이터
Output Register 나가는 데이터
한국말로 간단히 바꿔도 뭔 뜻일까 이미지가 생각이 난다
그리고 운송 단계가 있다
데이터 타입 | 약속 코드 | 비고 | ||
Read Discrete Inputs | 읽기 별개의 입력값 | 02 | 그니깐 분간해주는 값임 | Bit access |
Read Coils Write Simgle Coil |
읽기 코일(bit 읽기) 쓰기 하나 코일(bit 쓰기) |
01 05 |
코일을 읽어올꺼다 라는 명령어 코일에 값을 쓸꺼다 라는 명령어 |
|
Write Multiple Coils | 쓰기 여러게 코일 | 15 | 아마 16개까지 될듯함 | 16bit Access |
Read Input Register | 읽기 들어온값 신청하다 | 04 | 그니깐 읽을값을 하나 신청하는 거임 그래서 값을 받는거임 | |
Read Holding Registers | 읽기 붙잡아 신청하기 | 03 | 음..계속불러오기 인가? | |
Write Single Register Write Multiple Register |
쓰기 하나 신청하다(16bit) 쓰기 여러게 신청하다 |
06 16 |
비트가 많음 한 줄 바꾸는 거임 아!Register 줄이라 생각하면됨 | |
Read/ Write Multiple Registers |
읽기/쓰기 여러게 신청하다 | 23 | ???이건 뭐지??? | |
Read Exception Status | 읽기 예외 신분 | 07 | 진단하는거?? |
###대충 이런식
다음에 참고하여 더쓰겟움
8일차 모스키토 사용 (0) | 2020.04.16 |
---|---|
6일차 C#과 ModBus (0) | 2020.04.13 |
4일차 Fuction 3 코드 해석 (0) | 2020.04.09 |
2일차 코드?? (0) | 2020.04.07 |
1일차 C# 윈폼 EXCEL 데이터 컴파일 (0) | 2020.02.24 |