金南瓜提供专业稳定的E84 Contorl的解决方案,适用于采用semi E84对接的AMHS搬运系统,如OHT、AGV等。
JNG E84 PCI 到并行控制器是 300mm 设备制造商使用的现成解决方案,可为其产品提供符合 SEMI E84 的通信。凭借我们内置的加载和卸载算法,它是用于过程工具,储料器,Load Port, FOUP 缓冲区,智能存储架和模拟装载端口的完美 E84 通信解决方案。
通过标准的 PCI 通讯连接, JNG E84 可以轻松地与设备控制器集成。所有握手功能均自动执行,并带有错误检测和报告功能,仅需与设备控制器的通讯开销最小,同时支持出错自动恢复功能。
JNG E84 可以独立实现控制器利用其位置传感器和状态传感器输入。

E84物料传送过程

每家PLC厂商都有自己的通讯协议,三菱有MC、倍福有ADS,然而没有统一性的接口协议。
为适应每一家通讯,每一家设备商、MES和工厂等都需要针对每款产品开发相应的通讯接口。
OneConnectAPI为实现统一的接口,去适配每一家厂商的协议。为中国工控行业快速发展而贡献,每一家公司都需要重新制造轮子,这是非常浪费时间和金钱,同时也不能保证稳定性以及持续的维护。
我们采取高效的多线程处理方案,保证极其高效的读写性能,对电脑性能要求极其低,一直进行读写操作,CPU使用率不超过1%(Atom E3940下测试)。
用户可以在一台工控机上进行对上百台的PLC主动读写操作,我们在光伏行业大量应用和测试过。
我们在半导体行业深耕多年,积累大量的经验,实现功能的同时,也需要保证极其严格的稳定性,晶圆生成设备7*24小时不能出任何故障。
以下是我们的接口库下载以及源代码。


接口代码
#pragma once
#include <string>
#include "InterfaceExport.h"
#include "ModuleDevelopH.h"
// 欧姆龙Fins协议
class CFins
{
public:
CFins();
virtual ~CFins();
// 参数
CResult SetIP(std::string pIP); // 设置地址
CResult SetPort(int nPort); // 设置端口号
CResult SetTimeout(int nTimeMs); // 设置超时
// 读出
CResult Read(std::string pAddr, char& pData);
CResult Read(std::string pAddr, __int16& pData);
CResult Read(std::string pAddr, __int32& pData);
CResult Read(std::string pAddr, __int64& pData);
CResult Read(std::string pAddr, char* pData, int nSize);
CResult Read(std::string pAddr, __int16* pData, int nSize);
CResult Read(std::string pAddr, __int32* pData, int nSize);
CResult Read(std::string pAddr, __int64* pData, int nSize);
// 写入
CResult Write(std::string pAddr, char& pData);
CResult Write(std::string pAddr, __int16& pData);
CResult Write(std::string pAddr, __int32& pData);
CResult Write(std::string pAddr, __int64& pData);
CResult Write(std::string pAddr, char* pData, __int32 nSize);
CResult Write(std::string pAddr, __int16* pData, __int32 nSize);
CResult Write(std::string pAddr, __int32* pData, __int32 nSize);
CResult Write(std::string pAddr, __int64* pData, __int32 nSize);
private:
CResult SetParament(std::string pName, std::string pValue);
CResult SetParament(std::string pName, int nValue);
private:
CInterfaceExport* m_pFins;
CMgrDllDelegate m_pLoadInterface;
};
内部实现代码情况
#pragma once
#include "Communication.h"
class CFinsHandle : public CCommunication
{
public:
CFinsHandle();
long ReadMemoryData(int nAddr, int nSize, FINS_DATA_TYPE::ENUM nType, __int16* pData);
long WriteMemoryData(int nAddr, int nSize, FINS_DATA_TYPE::ENUM nType, __int16* pData);
private:
virtual void OnBeginRecv(); // 重写数据接收,开始接收数据
virtual void OnDataRecv(char* pData, int nSize); // 重写数据接收,用于协议识别
virtual void OnCloseConnect(); // 通讯关闭
// 检查答复数据是否错误
long CheckReplyDataIsError(char* pData, int nSize); // 检查答复数据是否错误
long GetFinsNodeAddress(); // 获取fins节点地址
long EstablishCommunicationByFins(); // 建立Fins通讯
private:
CMyString m_pRecvData;
bool m_bEstablishCommunicationByFins; // 与Fins建立通讯
int m_nIpNode; // IP节点
};
Fins函数实现
#include "stdafx.h"
#include "FinsHandle.h"
CFinsHandle::CFinsHandle()
{
m_bEstablishCommunicationByFins = false;
m_nIpNode = 0;
}
// 重写数据接收,用于协议识别
void CFinsHandle::OnDataRecv(char* pData, int nSize)
{
if (nSize > 0)
{
m_pRecvData.Append(pData, nSize);
if (m_pRecvData.Size() >= FINS_TCP_HEAD_SIZE)
{
FINS_TCP_HEAD pHead;
pHead.SetData(m_pRecvData.GetString());
int nAllSize = pHead.GetLength();
if (m_pRecvData.Size() >= nAllSize)
{
SetRecvComplete(nAllSize);
}
}
}
}
// 重写数据接收,开始接收数据,用于协议识别
void CFinsHandle::OnBeginRecv()
{
m_pRecvData.SetSize(0);
}
// 通讯关闭
void CFinsHandle::OnCloseConnect()
{
m_bEstablishCommunicationByFins = false;
}
long CFinsHandle::ReadMemoryData(int nAddr, int nSize, FINS_DATA_TYPE::ENUM nType, __int16* pData)
{
long nCode = 0;
if(nCode = EstablishCommunicationByFins())
{
return nCode;
}
CMyString pSendData;
// 获取发送内存
int nAllSize;
nAllSize = FINS_TCP_HEAD_SIZE;
nAllSize += FINS_CONTROL_HEAD_SIZE;
nAllSize += FINS_MEMORY_AREA_READ_SIZE;
pSendData.SetSize(nAllSize);
char* pBuff = pSendData.GetString();
// 头部信息
FINS_TCP_HEAD pHead;
pHead.nCommand = FINS_TCP_CMD_DATA;
pHead.SetLength(nAllSize); //长度
pHead.GetData(pBuff);
// control部分
FINS_CONTROL_HEAD pControlHead;
pControlHead.nDA1 = 0;
pControlHead.nSA1 = m_nIpNode;
pControlHead.nCmd1 = 0x01;
pControlHead.nCmd2 = 0x01;
pControlHead.GetData(pBuff + FINS_TCP_HEAD_SIZE);
// 数据部分
FINS_MEMORY_AREA_READ pMemory;
pMemory.nAreaCode = nType;
pMemory.nAddr = nAddr;
pMemory.nBitNo = 0;
pMemory.nLength = nSize;
pMemory.GetData(pBuff + FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE);
// // 发送数据
CMyString pRecvData;
nCode = SendSyncData(pSendData, pRecvData);
if (nCode == 0)
{
// 先判断答复数据的头数据是否正确
if(nCode = CheckReplyDataIsError(pRecvData.GetString(), pRecvData.Size()))
{
return nCode;
}
// 数据头
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pRecvData.GetString());
// 答复长度要求
int nMinSize = FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE + FINS_MEMORY_AREA_READ_FIX_R_SIZE + nSize * 2;
if(pHeadReply.GetLength() < nMinSize)
{
return FINS_REPLY_READ_DATA_TOO_SHORT;
}
else
{
// FINS协议部分
FINS_CONTROL_HEAD pControlHeadReply;
pControlHeadReply.SetData(pRecvData.GetString());
if (pControlHeadReply.nCmd1 != pControlHead.nCmd1 ||
pControlHeadReply.nCmd2 != pControlHead.nCmd2)
{
// 命令不一致
return FINS_REPLY_CMD_NO_IS_REQUST_CMD;
}
// 答复数据
FINS_MEMORY_AREA_READ_REPLY pReplyData;
pReplyData.SetData(pRecvData.GetString(), pRecvData.Size());
if(pReplyData.nEndCode != 0)
{
return FINS_REPLY_READ_DATA_FAIL;
}
// 拷贝数据
int nReadByte = nSize * 2;
if (pReplyData.GetDataBytsSize() == nReadByte)
{
memcpy(pData, pReplyData.GetData(), nReadByte);
}
else
{
return FINS_REPLY_READ_DATA_TOO_SHORT;
}
}
}
return nCode;
}
long CFinsHandle::WriteMemoryData(int nAddr, int nSize, FINS_DATA_TYPE::ENUM nType, __int16* pData)
{
long nCode = 0;
if(nCode = EstablishCommunicationByFins())
{
return nCode;
}
CMyString pSendData;
int nBytsSize = nSize * 2;
// 获取发送内存
int nAllSize;
nAllSize = FINS_TCP_HEAD_SIZE;
nAllSize += FINS_CONTROL_HEAD_SIZE;
nAllSize += FINS_MEMORY_AREA_READ_SIZE;
nAllSize += nBytsSize;
pSendData.SetSize(nAllSize);
char* pBuff = pSendData.GetString();
// 头部信息
FINS_TCP_HEAD pHead;
pHead.nCommand = FINS_TCP_CMD_DATA;
pHead.SetLength(nAllSize); //长度
pHead.GetData(pBuff);
// control部分
FINS_CONTROL_HEAD pControlHead;
pControlHead.nDA1 = 0;
pControlHead.nSA1 = m_nIpNode;
pControlHead.nCmd1 = 0x01;
pControlHead.nCmd2 = 0x02;
pControlHead.GetData(pBuff + FINS_TCP_HEAD_SIZE);
// 数据部分
FINS_MEMORY_AREA_WRITE pMemory;
pMemory.nAreaCode = nType;
pMemory.nAddr = nAddr;
pMemory.nBitNo = 0;
pMemory.nLength = nSize;
pMemory.pData.Append((char*)pData, nBytsSize);
pMemory.GetData(pBuff + FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE);
// // 发送数据
CMyString pRecvData;
nCode = SendSyncData(pSendData, pRecvData);
if (nCode == 0)
{
// 先判断答复数据的头数据是否正确
if(nCode = CheckReplyDataIsError(pRecvData.GetString(), pRecvData.Size()))
{
return nCode;
}
// 数据头
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pRecvData.GetString());
// 答复长度要求
int nMinSize = FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE + FINS_MEMORY_AREA_WRITE_R_SIZE;
if(pHeadReply.GetLength() < nMinSize)
{
return FINS_REPLY_READ_DATA_TOO_SHORT;
}
else
{
// FINS协议部分
FINS_CONTROL_HEAD pControlHeadReply;
pControlHeadReply.SetData(pRecvData.GetString());
if (pControlHeadReply.nCmd1 != pControlHead.nCmd1 ||
pControlHeadReply.nCmd2 != pControlHead.nCmd2)
{
// 命令不一致
return FINS_REPLY_CMD_NO_IS_REQUST_CMD;
}
// 答复数据
FINS_MEMORY_AREA_WRITE_REPLY pReplyData;
pReplyData.SetData(pRecvData.GetString());
if(pReplyData.nEndCode != 0)
{
return FINS_REPLY_WRITE_DATA_FAIL;
}
}
}
return nCode;
}
// 获取fins节点地址
long CFinsHandle::GetFinsNodeAddress()
{
return 0;
}
// 检查答复数据是否错误
long CFinsHandle::CheckReplyDataIsError(char* pData, int nSize)
{
if (nSize < FINS_TCP_HEAD_SIZE)
{
// 小于最小要求数据
return FINS_REPLY_DATA_TOO_SHORT;
}
// 消息错误
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pData);
if (pHeadReply.nErrorCode)
{
return FINS_REPLY_ERROR_BY_MESSAGE;
}
return 0;
}
// 建立通讯
long CFinsHandle::EstablishCommunicationByFins()
{
if (m_bEstablishCommunicationByFins)
{
// 已经建立通讯连接了
return 0;
}
long nCode = 0;
CMyString pSendData;
// 获取发送内存
int nAllSize;
nAllSize = FINS_TCP_HEAD_SIZE;
nAllSize += FINS_CONNECT_REQUST_SIZE;
pSendData.SetSize(nAllSize);
char* pBuff = pSendData.GetString();
// 头部信息
FINS_TCP_HEAD pHead;
pHead.nCommand = FINS_TCP_CMD_CONNECT_REQUST;
pHead.SetLength(nAllSize); //长度
pHead.GetData(pBuff);
// IP地址
FINS_CONNECT_REQUST pConnectRequst;
pConnectRequst.GetData(pBuff + FINS_TCP_HEAD_SIZE);
// 发送数据
CMyString pRecvData;
if(nCode = SendSyncData(pSendData, pRecvData))
{
return nCode;
}
// 处理返回值
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pRecvData.GetString());
// 检查头信息
if (pHeadReply.nErrorCode == 0 &&
pHeadReply.nCommand == FINS_TCP_CMD_CONNECT_RESPONSE)
{
// 提取 IP Node信息
if (pHeadReply.GetLength() == FINS_TCP_HEAD_SIZE + FINS_CONNECT_RESPONS_SIZE)
{
// 提取
FINS_CONNECT_RESPONSE pConnectResponse;
pConnectResponse.SetData(pRecvData.GetString());
m_nIpNode = pConnectResponse.pClientAddrss[3];
// 建立通讯成功
m_bEstablishCommunicationByFins = true;
return 0;
}
}
return FINS_REQUST_CONNECT_FAIL;
}
| 功能 | SECS Driver | SECS/GEM基础版 | SECS/GEM高级版 |
| HSMS连接 | √ | √ | √ |
| SECS自定义SxFy消息 | √ | √ | √ |
| 状态反馈 | √ | √ | √ |
| HSMS状态管理 | √ | √ | √ |
| 自动断线重连 | √ | √ | √ |
| 超时处理 | √ | √ | √ |
| State Models | √ | √ | |
| Equipment Processing States | √ | √ | |
| Host Initiated S1F13/F14 Scenario | √ | √ | |
| Event Notification | √(*) | √ | |
| On-Line Identification | √ | √ | |
| Error Messages | √ | √ | |
| Documentation | √ | √ | |
| Control (Operator Initiated) | √ | √ | |
| Establish Communications | √ | √ | |
| Dynamic Event Report Configuration | √ | √ | |
| Data Variable and Collection Event Namelist Requests | √ | √ | |
| Variable Data Collection | √(*) | √ | |
| Trace Data Collection | √ | √ | |
| Status Data Collection | √ | √ | |
| Alarm Management | √(*) | √ | |
| Remote Control | √ | √ | |
| Equipment Constants | √ | √ | |
| Process Program Management | √ | √ | |
| Material Movement | √ | √ | |
| Equipment Terminal Services | √ | √ | |
| Clock | √ | √ | |
| Limits Monitoring | √ | √ | |
| Spooling | √ | √ | |
| Control (Equipment-Initiated) | √ | √ |
Labview功能非常强大,但是对于一些领域性非常强的地方时候,就需要第三方模块支持。
广州金南瓜科技提供成熟的labview解决方案,原生态的labview接口,使得用无需学习labview以外的开发知识。
金南瓜Labview Secs/GEM解决方案使用简单,初始化过程只需添加3个模块,后续发送事件、数据、警报等功能即可随时使用。
成熟的解决方案,让项目快速支持SECS/GEM,缩短95%的项目进度时间,得到客户的一致好评。
7*24小时稳定是我们的基本要求,让你用得放心,用得舒心。




金南瓜为你快速搭建设备与工厂之间的交互。
我们为你提供专业的设备设计方案,使得设备更加稳定而高效,进而比同行更有优势。
仅需数周,设备就能得到客户的验收与认可,SECS 7*24 稳定运行于现场。
我们完整的核心功能让你专注于设备优化和销售,无需顾虑设备与工厂之间的交互。
最新的SEMI 标准 :
金南瓜 SECS强调遵循最新 的SEMI 标准。让你的产品时俱进,引领时代新潮流
不同工厂会实现出不同的MES系统 ,我们的产品会智能兼容
不存在繁体字、英文SDK的乱码及未知BUG
规格 :
1 .符合SEMI E5、E30、E37 的 SECS 通讯规范
2. 完善 Log 档案可查询历史通讯记录
3 .支持C、C++、C#、Labview、PLC等
软件特点:
1. 拥有完善的方案 ,软件开发时间可缩短80% 。
2. 已经集成大量的逻辑和各类的应用场景,稳定运行于几十个工厂
3. 以 DLL 模块提供API接口使用,简单方便
硬件:
1. 低至入门级别CPU ,例如赛扬、奔腾
优势:
1.全中、英文说明书,无需为英语而烦心
2. 中文 SDK 以及完善的使用资料
3. 自主开发,拥有软件的全部知识产权,能够改善和优化系统
4. 优秀的模块化设计及交互API,毫秒级交互
金南瓜SECS/GEM通讯软件工具包提供设备端SDK和连接工具。

功能清单
事件报告、警报通知、数据上报、远程控制、Recipe上传下载等等

| Stream | Function | Message Name | Description |
| Sx | F0 | Abort Transaction | H <–> E |
| S1 | F1 | Are You There Request | H <–> E |
| S1 | F2 | On Line Data | H <–> E |
| S1 | F3 | Selected Equipment Status Request | H –> E |
| S1 | F4 | Selected Equipment Status Data | H <– E |
| S1 | F11 | Status Variable Namelist Request | H –> E |
| S1 | F12 | Status Variable Namelist Reply | H <– E |
| S1 | F13 | Establish Communications Request | H <–> E |
| S1 | F14 | Establish Communications Request Acknowledge | H <–> E |
| S1 | F15 | Request OFF-LINE | H –> E |
| S1 | F16 | OFF-LINE Acknowledge | H <– E |
| S1 | F17 | Request ON-LINE | H –> E |
| S1 | F18 | ON-LINE Acknowledge | H <– E |
| S1 | F21 | Data Variable Namelist Request | H –> E |
| S1 | F22 | Data Variable Namelist | H <– E |
| S1 | F23 | Collection Event Namelist Request | H –> E |
| S1 | F24 | Collection Event Namelist | H <– E |
| S2 | F13 | Equipment Constant Request | H –> E |
| S2 | F14 | Equipment Constant Data | H <– E |
| S2 | F15 | New Equipment Constant Send | H –> E |
| S2 | F16 | New Equipment Constant Acknowledge | H <– E |
| S2 | F17 | Date and Time Request | H –> E |
| S2 | F18 | Date and Time Data | H <– E |
| S2 | F23 | Trace Initialize Send | H –> E |
| S2 | F24 | Trace Initialize Acknowledge | H <– E |
| S2 | F29 | Equipment Constant Namelist Request | H –> E |
| S2 | F30 | Equipment Constant Namelist | H <– E |
| S2 | F31 | Date and Time Set Request | H –> E |
| S2 | F32 | Date and Time Set Acknowledge | H <– E |
| S2 | F33 | Define Report | H –> E |
| S2 | F34 | Define Report Acknowledge | H <– E |
| S2 | F35 | Link Event Report | H –> E |
| S2 | F36 | Link Event Report Acknowledge | H <– E |
| S2 | F37 | Enable/Disable Event Report | H –> E |
| S2 | F38 | Enable/Disable Event Report Acknowledge | H <– E |
| S2 | F41 | Host Command Send | H –> E |
| S2 | F42 | Host Command Acknowledge | H <– E |
| S5 | F1 | Alarm Report Send | H <– E |
| S5 | F2 | Alarm Report Acknowledge | H –> E |
| S5 | F3 | Enable/Disable Alarm Send | H –> E |
| S5 | F4 | Enable/Disable Alarm Acknowledge | H <– E |
| S5 | F5 | List Alarms Request | H –> E |
| S5 | F6 | List Alarm Data | H <– E |
| S5 | F7 | List Enabled Alarm Request | H –> E |
| S5 | F8 | List Enabled Alarm Data | H <– E |
| S6 | F1 | Trace Data Send | H <– E |
| S6 | F2 | Trace Data Acknowledge | H –> E |
| S6 | F11 | Event Report Send | H <– E |
| S6 | F12 | Event Report Acknowledge | H –> E |
| S6 | F13 | Annotated Event Report Send | H <– E |
| S6 | F14 | Annotated Event Report Acknowledge | H –> E |
| S6 | F15 | Event Report Request | H –> E |
| S6 | F16 | Event Report Data | H <– E |
| S6 | F17 | Annotated Event Report Request | H –> E |
| S6 | F18 | Annotated Event Report Data | H <– E |
| S6 | F19 | Individual Report Request | H –> E |
| S6 | F20 | Individual Report Data | H <– E |
| S6 | F21 | Annotated Individual Report Request | H –> E |
| S6 | F22 | Annotated Individual Report Data | H <– E |
| S7 | F1 | Process Program Load Inquire | H <–> E |
| S7 | F2 | Process Program Load Grant | H <–> E |
| S7 | F3 | Process Program Send | H <–> E |
| S7 | F4 | Process Program Acknowledge | H <–> E |
| S7 | F5 | Process Program Request | H <–> E |
| S7 | F6 | Process Program Data | H <–> E |
| S7 | F17 | Delete Process Program Send | H –> E |
| S7 | F18 | Delete Process Program Acknowledge | H <– E |
| S7 | F19 | Current EPPD Request | H –> E |
| S7 | F20 | Current EPPD Data | H <– E |
| S9 | F1 | Unrecognized Device ID | H <– E |
| S9 | F3 | Unrecognized Stream Type | H <– E |
| S9 | F5 | Unrecognized Function Type | H <– E |
| S9 | F7 | Illegal Data | H <– E |
| S9 | F9 | Transaction Timer Timeout | H <– E |
| S9 | F11 | Data Too Long | H <– E |
| S9 | F13 | Conversation Timeout | H <– E |
| S10 | F1 | Terminal Request Acknowledge | H <– E |
| S10 | F2 | Terminal Request Acknowledge | H –> E |
| S10 | F3 | Terminal Display, Single | H –> E |
| S10 | F4 | Terminal Display, Single Acknowledge | H <– E |
额外的功能
由于功能实现困难,国内基本没供应商有能力实现该功能,而金南瓜已经实现并且在提供给数十家工厂终端使用。
Wafer Map 和Strip Map上传下载,在固晶机器和点测设备属于重要的功能。点测设备将测量结果通过Map报告测量结果,固晶机器通过Wafer Map获知需要提取的颗粒。


GEM300应用于半导8/体12寸的芯片产线。
— 装有晶圆的300毫米 carrier 太重,操作员重复的手动装卸装有晶圆的300毫米carrier 会因疲劳而导致跌损。相反,carrier可以直接自动交付给自动化设备AMHS(OHT、AGV)。
自动化将需要GEM300通信标准。遵循GEM300标准对于全自动300毫米生产线至关重要,其中单个25片晶圆FOUP价值数百万欧元,并且比200毫米线更具破损和误加工风险。
— 广州金南瓜科技是市场上首款符合GEM300标准的SDK。GEM300是SEMI标准的全能名称,可满足300 mm自动化要求。这些包括处理和计量工具的自动过程控制的软件和硬件要求,包括与AGV,PGV和RGV(自动,个人和轨道引导车辆)和OHT(架空起重运输)的接口。GEM300为工厂主机提供一致的界面,而符合SEMI 标准的人机交互使GEM300功能可供用户使用。广州金南瓜科技的GEM300实施和操作细节将不断根据行业标准测试包进行检查。
PV2是什么?
SEMI PV2是针对光伏行业对SECS/GEM协议进行简化
光伏行业特点:
光伏行业属于流水线作业行业,和半导体的离散型模式不一样。
光伏在通讯这块侧重点就会不一样,以数据采集为主。
recipe切换需要整条产线停产切换,所以功能上需求不高。
数据上传能力要求高:
光伏设备一般以产线为单位,所以单个产线的数据点非常多,一般都有几千的数据点(int、double、string为单位,不是以字节为单位)。
金南瓜PLC SECS/GEM特点:
金南瓜针对光伏行业对性能深度优化,PLC SECS产品处理数上万的数据点(int、double、string为单位)时候,能够做到300毫秒以内/一个处理周期。
采用各家PLC高效的私有协议对接,底层优化C++语法以及使用部分汇编优化算法。
金南瓜SECS/GEM SDK特点:
金南瓜采用高效交互方法,将单个数据处理时间耗时在10ms(毫秒)以内。
应用现场:
金南瓜SECS/GEM伴随国产光伏设备大厂一起销往印度、马来西亚、台湾省等等境外地区。

PV2光伏市场中工厂主机与生产设备之间的基本通信
PV2是光伏制造中工厂到设备之间通讯和控制的基准,通过采用通用接口,工厂和设备供应商都可以减少集成工作和提高生产效率能力。
PVECI(PV2):光伏设备通讯接口
PV2标准大大降低了集成成本。因此,许多在其产品包括光伏的制造商利用PV2进行通讯与采集,无需像半导体一样复杂与集成度极高。
广州金南瓜科技推出支持光伏PV2通讯的解决方案,短时间内就能快速支持光伏设备与工厂之间的通讯能力。同时,搭建成本大大降低,人力投入也同比降低。