SecsForNet 1.0.2
See the version list below for details.
dotnet add package SecsForNet --version 1.0.2
NuGet\Install-Package SecsForNet -Version 1.0.2
<PackageReference Include="SecsForNet" Version="1.0.2" />
<PackageVersion Include="SecsForNet" Version="1.0.2" />
<PackageReference Include="SecsForNet" />
paket add SecsForNet --version 1.0.2
#r "nuget: SecsForNet, 1.0.2"
#:package SecsForNet@1.0.2
#addin nuget:?package=SecsForNet&version=1.0.2
#tool nuget:?package=SecsForNet&version=1.0.2
secs4net
Project Description
SECS-II/HSMS-SS/GEM implementation on .NET. This library provides an easy way to communicate with SEMI-standard compatible devices.
Getting started
Install Nuget package
> dotnet add package Secs4Net
Configure via .NET dependency injection
public void ConfigureServices(IServiceCollection services)
{
// "secs4net" configuration section in the appsettings.json
// "secs4net": {
// "DeviceId": 0,
// "IsActive": true,
// "IpAddress": "127.0.0.1",
// "Port": 5000
// }
services.AddSecs4Net<DeviceLogger>(Configuration);
}
class DeviceLogger : ISecsGemLogger
{
// implement ISecsGemLogger methods
}
Basic usage
try
{
var s3f17 = new SecsMessage(3, 17)
{
Name = "CreateProcessJob",
SecsItem = L(
U4(0),
L(
L(
A("Id"),
B(0x0D),
L(
A("carrier id"),
L(
U1(1)),
L(
U1(1),
A("recipe"),
L()),
Boolean(true),
L()))))
};
//access list
s3f17.SecsItem[1][0][0] == A("Id");
foreach(var item in s3f17.SecsItem[1][0][2].Items)
{
}
//access an unmanaged array item
byte b2 = s3f17.SecsItem[0].FirstValue<byte>(); // with different type
s3f17.SecsItem[0].FirstValue<byte>() = 0; // change original value
byte b3 = s3f17.SecsItem[0].GetFirstValueOrDefault<byte>(fallbackValueWhenItemIsEmpty);
Memory<byte> bytes = s3f17.SecsItem[0].GetMemory<byte>();
// access string item
string str = s3f17.SecsItem[1][0][0].GetString(); // str = "Id"
//await the secondary message
var s3f18 = await secsGem.SendAsync(s3f17);
// process message with LINQ
var query =
from a in s3f18.SecsItem[3]
select new {
num = a.FirstValue<int>(),
};
}
catch(SecsException)
{
// exception when
// T3 timeout
// device reply SxF0
// device reply S9Fx
}
Handle primary messages
await foreach (var e in secsGem.GetPrimaryMessageAsync(cancellationToken))
{
using var primaryMsg = e.PrimaryMessage;
//do something for primary message
// reply secondary message to device
using var secondaryMsg = new SecsMessage(...);
await e.TryReplyAsync(secondaryMsg);
};
Creates Item via LINQ
using static Secs4Net.Item;
var s16f15 =
new SecsMessage(16, 15)
{
Name = "CreateProcessJob",
SecsItem = L(
U4(0),
L(
from pj in tx.ProcessJobs
select
L(
A(pj.Id),
B(0x0D),
L(
from carrier in pj.Carriers
select
L(
A(carrier.Id),
L(
from slotInfo in carrier.SlotMap
select
U1(slotInfo.SlotNo)))),
L(
U1(1),
A(pj.RecipeId),
L()),
Boolean(true),
L()))));
Change the Item value (restricted)
Basic rule: The
Item.Counthas been fixed while the item was created.
You can only overwrite values on existing memory. String Item is immutable, coz C# string is immutable as well.
Reuse array for large item values
All unmanaged data Item can created from IMemoryOwner<T> or Memory<T>.
The following sample uses the implementation of IMemoryOwner<T> from Microsoft.Toolkit.HighPerformance that has been referenced internally by secs4net..
var largeArrayOwner = MemoryOwner<int>.Allocate(size: 65535);
// feed the value into largeArrayOwner.Memory or largeArrayOwner.Span
FillLargeArray(largeArrayOwner.Memory);
using var s6f11 = new SecsMessage(6, 11, replyExpected: false)
{
Name = "LargeDataEvent",
SecsItem = L(
L(
I2(1121),
A(""),
I4(largeArrayOwner))), // create Item from largeArrayOwner
};
// apply using on received message as well. coz the item decoded by PipeDecoder also uses MemoryOwner<T> when the data array is big.
using var s6f12 = await secsGem.SendAsync(s6f11);
IMemoryOwner<T>,Item, andSecsMessagehave implementedIDisposabledon't forget toDisposeit when they don't need anymore. Otherwise, the array will not return to the pool till GC collects.
Since the length of the max encoded bytes in a single non-List Item was
16,777,215(3 bytes), we split raw data into separated items. In that case, creating the Items from slicedMemory<T>is more efficient.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- CommunityToolkit.HighPerformance (>= 8.4.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- PooledAwait (>= 1.0.49)
- System.IO.Pipelines (>= 8.0.0)
- System.Threading.Channels (>= 8.0.0)
-
net6.0
- CommunityToolkit.HighPerformance (>= 8.4.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- PooledAwait (>= 1.0.49)
- System.IO.Pipelines (>= 8.0.0)
- System.Threading.Channels (>= 8.0.0)
-
net8.0
- CommunityToolkit.HighPerformance (>= 8.4.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- PooledAwait (>= 1.0.49)
- System.IO.Pipelines (>= 8.0.0)
- System.Threading.Channels (>= 8.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on SecsForNet:
| Package | Downloads |
|---|---|
|
SecsForNet.Sml
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.3.4-alpha | 199 | 9/9/2025 |
| 1.0.3.2-alpha | 213 | 9/3/2025 |
| 1.0.2 | 551 | 7/24/2025 |
| 1.0.1 | 224 | 6/23/2025 |